{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 14 Dimension Reduction of Matrix Data\n",
    "# 14.1. Clustering 2D Data in 1-Dimension\n",
    "\n",
    "Consider a scenario, in which we manage an online clothing store. When customers visit our website, they are asked to provide their height and weight. These 2D measurements are used to offer customers appropriately-sized clothing, based on whatever inventory is available. Our inventory comes in 3 sizes; Small, Medium, and Large. Given the measurement data for 180 customers, we would like to do the following:\n",
    " \n",
    " \n",
    "1. We want to group our customers into 3 distinct clusters, based on size.\n",
    "\n",
    "2. We want to build an interpretable model to determine the clothing-size category of each new customer, using our computed clusters.\n",
    "\n",
    "3. We want our clustering to be simple enough for our non-technical investors to comprehend. \n",
    "\n",
    "The third point in particular limits our decisions. Our clustering can’t rely on technical concepts, such centroids or distances to the mean. Ideally, we’d be able to explain our model in a single figure. We can achieve this level of simplicity, using dimension reduction. However, we’ll first need to simulate the 2D measurement data for 180 customers.\n",
    "\n",
    "**Listing 14. 1. Simulating a range of heights**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "heights = np.arange(60, 78, 0.1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A linear relationship exists between height and weight. It has been shown that on average, a person's weight in pounds equals approximately `4 * height - 130`. Of course, each individual person's weight fluctuates around this average value. We'll model these random fluctuations using a Normal distribution with a standard deviation of 10 lb. Thus given a `height` variable, we can model the weight as `4 * height - 130 * np.random.normal(10)`. \n",
    "\n",
    "**Listing 14. 2. Simulating weights using heights**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(0)\n",
    "random_fluctuations = np.random.normal(scale=10, size=heights.size)\n",
    "weights = 4 * heights - 130 + random_fluctuations"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can treat the heights and weights as 2-dimensional coordinates within a `measurements` matrix. Lets store and plot these measured coordinates."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEGCAYAAACKB4k+AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAqbUlEQVR4nO2df7RdZXnnP0+SC9zQSrCJVi6kBAdwge2QcmV0MrWAVvxNKtMC43TR1hmmrZbGWmoYZwraYRqLlTp1bBdWBu1CCIpN41AHdKDjKtOU3pgghkJFUciNlVi4Tmuu4ebyzB9nn5N9z917n/1773PO97PWXfee9+y9z3N2dt7nfZ+f5u4IIYQQACuaFkAIIUR7kFIQQgjRQ0pBCCFEDykFIYQQPaQUhBBC9FjVtABFWLt2rZ966qlNiyGEEEPF7t27v+Pu66LeG2qlcOqppzIzM9O0GEIIMVSY2Tfj3pP5SAghRA8pBSGEED2kFIQQQvSQUhBCCNFDSkEIIUSPoY4+EkKIJtixZ5Yb7n6UA3PznLRmkqsvOpPNG6eaFqsUpBSEECIDO/bMcs1nHmJ+YRGA2bl5rvnMQwAjoRhkPhJCiAzccPejPYXQZX5hkRvufrQhicpFSkEIITJwYG4+0/iwIaUghBAZOGnNZKbxYUNKQQgx1OzYM8umbfeyYetdbNp2Lzv2zFb6eVdfdCaTEyuXjE1OrOTqi86s9HPrQo5mIcTQ0oTTt3tdRR8JIUTLSHL6VjlJb944NTJKoB+Zj4QQQ8uoO32bQDsFIcTQctKaSWYjFEDbnL7DlOymnYIQYmgZBqdv1+8xOzePc9TvUbVDPC9SCkKIoWXzxil+5y0/ytSaSQyYWjPJ77zlR1u1Ch+2ZDeZj4QQQ01Wp2/dppxh83tIKQghxoYmQljj/B4rzNiw9S5OmJzADOYOLbTC3yClIIQYG5oIYb36ojOXKKIui+4AzM0v9Ma6Smrmm09z3yMHG3FMSykIIcaGJkw5/cluK8x6CiGK+YVFbt31BN0j6q7CKkezEGJsaKpu0eaNU9y/9UIe3/YGnktQCF36j6jTMS2lIIQYG9oQwppXAdXlmJZSEEKMDXWEsA4q0BelmMJYzHhdCXnyKQghxooy6xb1h7de8JJ13Ll7NjG6qd/H0B991H8NqHc3Y57CvtVWpqenfWZmpmkxhBAjRppchv7wVuis8qNm1Kk1k9y/9cJSP78IZrbb3aej3tNOQQghQqTNZYgKb41bYmf1BzRZhVU+BSGECJG2LEWWib5tBfqSkFIQQogQaXMZ4ib6fkdx2wr0DUJKQQghQqTNZYgLb33ry9enim7K20a06vaj8ikIIUSIqLIUUav9PG05uw7k2bn5JU7ptFnLddRuUvSREEL0UUX0T1S0Uj+DopQ2bbs3srhe1uimRqKPzOxm4I3AU+7+0mDsHOCPgOOAI8CvuPsDwXvXAG8DFoGr3P3uqmQTQow2RSf1KqJ/ohzY/QxyXtdRu6lK89EtwIeBT4TGfhd4r7t/zsxeH7w+38zOAi4DzgZOAr5gZme4e/IdFEK0ija0nWyiPHYa0kzcg6KU6mg/Wpmj2d2/CDzdPww8L/j7BOBA8PfFwO3uftjdHwceA86rSjYhRPm0pe1kWzudDZq400Qp1VG7qe7ooy3ADWb2JPAB4JpgfAp4MnTc/mBsGWZ2pZnNmNnMwYMHq5RVCJGBtkzGbe10FjWhd8NX09ZgqqN2U93RR78MvNPd7zSznwU+Brya6BpQkR5wd78JuAk6juaqBBVCZKMtk3EdJpY85IlWirtOlWawupXCFcCvBX9/Cvjj4O/9wCmh407mqGlJCDEEND0Zx4V7QnsSyJosX5GWus1HB4CfDP6+EPhq8PdO4DIzO9bMNgCnAw/ULJsQogBN9ioI+zOgoxCymmZEhypDUm8DzgfWmtl+4Frg3wMfMrNVwPeBKwHcfZ+Z3QE8TCdU9e2KPBJiuCjLPJKHuOJ0WeP320xdkV2VKQV3vzzmrXNjjr8euL4qeYQQ1dOUeaRpf0bVE3adYbaqfSSEGHqa6r0M9YTi1hnZJaUghBh6mvRn1DFh17kTUkE8IcaMNmQdl02T/ow6Juw6I7ukFIQYI9paAqIMmvJn1DFhX/CSddy664lawmxlPhJijGhL1nFZVN1bIA1Vm6527Jnlzt2zSxSCAZecW40S1E5BiBGm31QUtaKF5ktA5KEtu56yTFdxZr24cNv7HqmmzI+UghAjRHhiOWFygu89e4SFxc4aMyrTt0tWU0cb/BJJu566ZSlquopTcDPffLp2RS6lIMSI0D+xzM0vLDumm+lbxDbdlhV607kJZRKn4G7d9UTsOVWF20opCDGk9K/WDz17ZGATFzia6Zt3ld+WFXrTtZbKJE6RxVX8rDLcVkpBiCEkarWelqKlH6pYoac1R/WbxyZWWs88Bvkny6bNYUn+niiqrOWk6CMhhpA0rR2jKGOFWXb2cFRG8Jbte9n4vnuWRBP1Hzc3vwAOJ66eKNRboA3NgZJ6LfQztWayUoUlpSDEEJJ2VT6xwgpPmv2UHYIZp+CeObSwZHKOOm7hOWf1Mat4fNsbuH/rhbm+WxvCdKOa57z15esbydKW+UiIISTO3LBmcoLjj11VqRmk7OzhJAU3v7DIlu17e30Ssp7fT5SZKK05LNyvYaUZi+5MlXiP++/rfY8c5JJzp7jvkYO1mrWkFIRoKUl27qsvOnOJTwE6q8jr3nx2LbbwMrOH09jTywinjYuaWrN6gmcOLY/UCl+3/9xF9yXXgOKRV1Hy3bl7tvZeEDIfCdFCBtm5B/XqbUOmb1qizFFRhBvnhDn07JFU3y/OTOTOQDNNkg+nLFNTG8xYoJ2CEK0kTdhn3Gq9DXkEUbsciDY5dWW6bue+yNyKME7HRBY+rut7gOTvF2cm+u78Ajdeek6iOWyQiaqM3Ii25F1IKQjRQopMEE3nEUQppas/9SAYS7KrwxN59ydst49iKjDp9CuPNN8vKa9hkDlskImrjNyItuRdyHwkRMNEmXqKhH2WteLMa4KKixIK5xNAtGlk88Yp7t96Ib9/6TmxJp28369I1FSSiausiKAme0KEkVIQokHifAcXvGRd7gmijDyCIrH7WZRP3LFJPpO832+QHybtuQArrePdSLpGVqVaRL4yMfe4ROr2Mz097TMzM02LIURuNm27N9Jk0A11zBP22W++gY5CSZpgokpmREXkpMmGjvtOUeTJrs7z/eqm7TKa2W53n456Tz4FIRokyRSSN+wzax5BlpIZaXYBUeGyUeQ1jeTJk8hTRqNIXkDTfp0iSCkI0SBVORezKJQsJTPSyNX93Hfd8WAvnr+foklfWb5f2misMqO22hJJlAf5FIRokKadizv2zKY29WSRa/PGKZ6LUQgGuUtS5CFt/H+ZeQJl14eqE+0UhGiQOhrOx5lEuivjOIqWzBi0C6qrMmnc6nx2bp5N2+6tpCtdXMZ53ZFEeZBSECIjZU9mVTacTzKJJJmNjE4uwPHHruLGS8/JJV/SxFhngl3chG8c9Z+UkYPQ/1w0UbeoDKQUhMhAG7KFs5BkEklaAXcNP0W+X9IuaNO2exNNNWUq3SjlFFdHqZ+0q/u21C0qA4WkCpGBpBDSIo1rqmLD1rsiJz8jW2OXsr9fnFzQmYjLDuXsX8Wn+d5rJicwg7lDCwOV07A9FwpJFaIkhi2qJMmunzZ0FDor3w1b7+KEDBNlHrlWmlUSytlvokuTS3H4yHNLVv5btu/lvZ/dx7VvWl6JNum5aLqrW1YUfSREBpqOKsmaJZsU3RSVQXvi6onYa3W7nT1zaKFwh7I4ueJCWMtWuoMqs0YpJ1je+KdL3L//CZMTjXd1y4qUghAZaDKENE/piUGlE7q1hrqdy65909mpylh3yRuyGSfXVE1Kt/v5ayaXK8Ek5QTR3znuuTCjFeWws1CZ+cjMbgbeCDzl7i8Njf8q8A7gCHCXu/9mMH4N8DZgEbjK3e+uSjYh8lJHCGkcebNks0Q39X+/NB7HvKv4OLnqCuXsr8wa/vdMqtQKy79z3HPxzu17U53fJqr0KdwCfBj4RHfAzC4ALgZ+zN0Pm9kLgvGzgMuAs4GTgC+Y2Rnunr0zuRAVU2UIaRJ1+TPC3y+N7b3MVXwZSjerDT+tcgoT9Z2jrhOnXNqcxFaZUnD3L5rZqX3Dvwxsc/fDwTFPBeMXA7cH44+b2WPAecBfVSWfEMNGE/X2Bzmjq1jFF1G6ZYUMJzX+yfKdhzGJrW6fwhnAT5jZX5vZ/zGzlwXjU8CToeP2B2PLMLMrzWzGzGYOHjxYsbhCHCWrk7fslphN+DP6bf9rJic4cfXEEj8A0JrWn2WWqti8cYq9176G37/0nNzlrNtSDjsLdYekrgJOBF4OvAy4w8xOI7r1aqQ5091vAm6CTp5CRXIKsYSsK9Aqktya8mckrdzblsxXhYmtqLmwKXNjXupWCvuBz3gnY+4BM3sOWBuMnxI67mTgQM2yCRFLVidvVaWT2zbBFP2eZcfwt6Wl5TBTt/loB3AhgJmdARwDfAfYCVxmZsea2QbgdOCBmmUTIpasK9CkImxtMLOURZGVeZHubnE0XXV2FKhMKZjZbXQcxWea2X4zextwM3CamX0FuB24wjvsA+4AHgb+F/B2RR6JNhG30lxhFjnJJ61MhyWJKQ1FkvnKtP93GUYbfttQ7SMhUhDVXrGfyYmVvcqYs3PzqYqutbU2Tlri7suJqyciy0F0z0nKAzDg8W1vKE2+YSoxUReqfSREQfqdvCvMlmW9zi8scuuuJ3qKwBlcjbNNSUx5JtC40M1uOYjwMd3PGKRcy7L/t80JPiykNh+Z2fFmlj7/XYgRI1wSIq6rWP+o09kNxJVvcGiFf6GIfX/zximOP3b5+jJtd7MwUfb/vKG9VZinxoFYpWBmK8zs35jZXWb2FPAI8C0z22dmN5jZ6fWJKUS7yLKaPTA3n1iArQ3+haIT6CCHc3diT8qOjrL/F1FWw1bRti0k7RTuA14MXAP8sLuf4u4vAH4C2AVsM7N/W4OMQrSOqEk+KtkGOgok7ACNoukVbNEJNMnhHJ7Y4+j6VqLKRORVVk1XtB1WkpTCq939t939y+7+XHfQ3Z929zvd/RJge/UiCtE+oqJc3vry9YnhkF3zU5zy6F9V1xm6WnQCTQoFzWMy6lJEWSk8NR+xjmZ373mNzOzHgX9FxwR6v7t/qf8YIcaNqESy6R95/kBnbVKCVV3O0X6n8gUvWcedu2cz1ehJ25M4rlIodJRpkkO7SDJakxVth5mBIalm9lvAzwCfCYY2A59y9/9SrWiDUUiqGEaiInC6LSfjQjXLDF2N+/wsjeaTvkP/OUVaVWb5HJGeoiGplwMb3f37wcW2AV8CGlcKQgwjSSvYOurvx9np73vkYGrFk6W8RZFKoVrt108apfAN4Djg+8HrY4GvVSWQEG2gqqSn/uveeOk5S65bR+2eMqJyslyj6MTe3wznndv3csPdj0o5VESsUjCzP6DjQzgM7DOzzwevfwr4y3rEE6J+qrLrp7luHfX3y1A8Wa9RtJCfEtHqIyn6aAbYDfwp8B/phKj+BfAe4HOVSyZEQdqW9DTout2V8PzCIiutE6NURe2eMqJy6o7sUSJafSRFH328TkGEKJMiK8uqkp6Srtsv76J7b5IteyVchp2+blu/EtHqI8l89BAJZVvc/ccqkUiIEihS578qu37SdavqvxBHGX0Z6uztoD4J9ZHkaH5jbVIIUTJFk57KtOuHq4L2F8ibWGEcevYIzxyKTvnRSrjDMPY6HlaSlMITPiCJwcxs0DFCNEFbkp76zULhyqlrJif4XoJCSCvvOJSHVmhqfSQphfvM7E7gz9z9ie6gmR1DJ7v5CjrO51sqlVCIHBRdWZZlGokyC3UrpwJLyk33k0becYrKaVsr0lElSSm8FvhF4LagReYcnXyFlcA9wI3uvrdqAYXIQ1kry6Kr8LxmrEHlH7rU5YsYh92I6JAUffR94CPAR8xsAlgLzLv7XE2yiQYZhUmgDbHxg8xYRUta1BGVM067EZGyyY67L7j7t6QQxoMqGqoPI2XExifF85cR65+lumnb8jZEO0ndeU2MD5oEOpSxCk9qJF9Gk/m0ikXNakRa1KNZLGOYJ4EyzV5lxcYnmbGKmriieiQfN7F8rdfGvA3RTgbuFMzs/WnGxOgwrB2ryjZ7DVOTlsNHen2weObQwrLvrWY1Ii1pzEc/FTH2urIFEe1hWCeBss1eZZh36iDN9y6i6IflPohySCpz8cvArwCnmdmXQ2/9IHB/1YKJ5hjWRKFBtYXyfJ9hiI1PswtoS96GaD9JPoVP0qmG+jvA1tD4P7r705VKJRpnGCeBONv3CZMTlYVUtiF0N43Nf1gVvaifge04AcxsJfBCQkoknOXcFGrHKcLEtW48bmJFZCmJoi0u29Iqsi1yiOGhUDtOM3sHcB3wbaDrzXJAVVIrog2rz2EkbjWctsVl1vs+yJZf17+hdgGiTAbuFMzsMeBfuPs/1CNSekZxp6BVXzqyTOBpGsfnue8btt4VW1t+cmKl/g1Fa0naKaSJPnoS+G65Iok4lDg2mKyhp2miqfLc97jInZVm+jcUQ0tS9NGvB39+HfgLM7uLTr9mANz9gxXLNpYMc+JYXWRNxEpjXslz3+MievplS3MtIdpCkk/hB4PfTwQ/xwQ/qTCzm+k06nnK3V/a995vADcA69z9O8HYNcDbgEXgKne/O+1njRLKHh1Mngl8UDRVnvsep2y6DXWyXCsL8jmJKkmqkvregte+Bfgw8InwoJmdQichLtyj4SzgMuBs4CTgC2Z2hrtHL7lGGHWYGsygCTzPpJn3vscpm6r+DVWxVFRNmjIXnzWznX0/f2Jmv2Zmx8Wd5+5fBKLyGW4EfpOlXQkvBm5398Pu/jjwGHBetq8yGih7dDBJPoK8pS7KvO9V/hvK5ySqJk1BvK8D64DbgteX0glPPQP4KPBzaT/MzN4MzLr7g2YWfmsK2BV6vT8Yi7rGlcCVAOvXr0/70UPFMCaO1UmSj2DTtntzF34r875X9W8on5OomjRKYaO7vzL0+rNm9kV3f6WZ7Uv7QWa2GngP8JqotyPGIqP93P0m4CbohKSm/XwxWvRPut1eAVFmJUieNIfBRt+VMe6Bl89JlEUapbDOzNZ3M5jNbD2dLmwAz2b4rBcDG4DuLuFk4Etmdh6dncEpoWNPBg5kuLYYYQZN2lE5Bv3ETZrDYKMf9P3kcxJlkkYpvAv4SzP7Gp0V/QbgV8zseODjaT/I3R8CXtB9bWbfAKbd/TtmthP4pJl9kI6j+XTggdTfQqRiGFbE/aSZtKPs7GGSJs26ehznZceeWd51x4MsxiSZpu3lLERaBioFd/9zMzsdeAkdpfBI0L8Z4PfjzjOz24DzgbVmth+41t0/FvMZ+8zsDuBh4Ajw9nGMPEpDd2KfnZtnpRmL7qkmhv+04yFu3fVEz/yQd0WcV7HkPS/NpJ1kGhp0b9pso+8qxDiFYFCodpMQUSQlr13o7vea2Vv63jrNzHD3zyRd2N0vH/D+qX2vrweuHyDvWNO/au5OFoMm+B17ZpcohC5ZV8R5TS1R571z+162bN9byqQdF6KapuBdm/NCBu2A2iCjGD2SQlJ/Mvj9poifN1Ysl4ggaZJICktMclBmWRHnDYeMOq9/xxIXMpqmOUyRpkBtbiiU9G/TFhnF6JGUvHZt8PsX6hNHJDFoAs9jCsmy2sxrahn0ftKOJU1SWd4qoV2T1vzCYiZTXF3E7WJWmil3RVRGmtLZLwT+K3CSu78uyD5+RZx/QFRH3CQRfj/LeQaZVpt5M4kHyQ3xiiPthJ81LyDKFNdVNnkm2yqc+HEKUQpBVEmaKqm3AHfTiQoC+DtgS0XyiASiTB1dkswJUecZ8NaXr880ueTNJE6Su8ugGkP3b72Qx7e9gfu3Xti6zOC8WdSDUHa7aII0Ialr3f2OoGAd7n7EzEYuMmgYwjXDq+Ys0UdlNWHJm0ncdfZ25TaWZibWaR8PR29FkSfqqMqwVmW3i7pJoxS+Z2Y/RPD/2Mxezoj1VxiGBKYueSeJsiaXuOsM8jd0z9uxZ5brdu5jbr7THvPE1RNc+6aza7nPRZLckmhzWKsQWUljPnoXsBN4sZndT6fq6a9WKlXNqMhYcdJECXUn5a5CAPj+wnNRp1VCkSS3JNJ8dyGGhVilYGZbzOxlwIN0wlP/JfAfgLPd/cs1yVcLWukVp6ruZmG69Y02bL2LTdvuzWyzT/r3PHH1RG57fZvDWoXISpL56GTgQ3Qymb8M/F/gfjo1iaJKYg8tVSYwDYOvogzi/A3Q6ZF8IHDCRpFG+ZZh4kuKgiqyYynLZyNEGzCPSaHvHWB2DDBNZ6fwiuBnzt3Pql68ZKanp31mZqbwdfI0bW/yusNCGhs+LM08jlOicRVQ02Qtp5Uny7WEGGbMbLe7T0e9l8bRPAk8Dzgh+DkAPFSeeM3TnaDDDtDjJtK4W5Jpe7G1qhlkw4elZpak3UAZJr7uPd+yfW/itcZldydEFEm1j26i0x7zH4G/pmM++qC7P1OTbLVz+MhRE8IzhxYKRyCNu68i6XsaLDMxRe0Eukq0LBPf5o1TiT2UhykSTYgqSFoOrweOBf4emKXT82CuBpkaoYoIpHGPSon7nlNrJnuJaEAv8SuOA3PzpTpzk66lSDQx7sQqBXd/LfAy4APB0LuAvzGze8zsvXUIVyd5VvWDomHGPSolb0RSPyetmayth/K47+6ESPQpeMcL/RUzm6OTsPZdOhVSzwOurVy6GslqnkhjZhj3qJQ033/QZBtWIlGJc3nt/3FJeG0upS1EHcRGH5nZVXQijjYBC3TCUf8q+P2Qu9eXdRRD3uijqIkEyBQpVEY0jIi/jzC4QU4V0V1x17zk3Cnue+TgWCp3MXokRR8l+RROBT4NnOfup7n7z7n7R9z9wTYohLzEFS8DMpknyjYzFE3MaoqicscVyztx9cTAibcK+3+UaemSc6e4c/ds6QXvhGgjA/MU2kyenUJZK/wydwrDms9QVO5wcbr+InlAbyxux7Bh612RCXEGPL7tDcs+J+8qX7tCMWrk3SmMJGWt8Mt0Ijdd/iEvReQO79hguUIIj8WtzLPUWyqyypfzWYwTY6cUygoTLTMapsikM2jSq1JhxMk3Ozc/8DPTRB2FiVI2ddRbAoUWi/EiTUbzSJGmvWNayipHXSTiZdCkV2UiVlJHt+543GfmWWX3n1MkuinL55f5zAjRdsZOKbQtTHTHnlm+d/jIsvG0k07SpFd1mY2oyTLKNxD1mWladPYTpSQHKeYyQkzb9swIUSVjpxSgPd2s4gq0ZWk8kzTpVW0Lj5os03Y0i1IoEyuMHzhuFc8cWiitO1tZq/y2PDNCVM1YKoW2EGdXX33MqtQT0AUvWcetu56InECTavxkISl6p3+yjIvU6f/MQavvsorSaZUvRDakFBqk6Ep+x55Z7tw9u0QhGHDJuUcn6qKr5KwF4rKszJNW32WuzLXKFyI9UgolkHdVW9TeHbXTcOC+Rw4CxVfjO/bM8q47HmSxL5clyS+hlbkQw42UQgJpJvsipZaL2rvT7DTiVsmD5O6+368QBn120mcKIdrP2OUppCVt0lOROPiiuQ5F4ucHyT0oj0Ax+kKMJtopxJA2nLOoXyDNqjpux5J3p7Fjz+zAKKEk+aM+Q93KhBgNxl4pxE1maSf7qkstpzFPZZmMu9eLoyt33PdaabZsN6NuZUKMDpUpBTO7mU7vhafc/aXB2A3Am4Bnga8Bv+Duc8F71wBvAxaBq9z97qpk65I0maWd7OMSuLqlHoqGWQ7asST5DKI+K8ksFN4BxO1Cosxbdfei1q5EiOqocqdwC/Bh4BOhsc8D17j7ETN7P3AN8G4zOwu4jE5P6JOAL5jZGe6evjhODpIms7SmmfBqvb/a5+zcPFu27+W9n93HG37sRdy5ezbzajpvR7g4ZZd0XnjCz7ILGVQDqczJW7sSIaqlMqXg7l80s1P7xu4JvdwF/Ovg74uB2939MPC4mT1Gp7vbX1UlHyRPuFkmxe5qPS5x65lDC8sSzCDdajpux3LC5ETsOUnKLu56U0HLy6jvNYgiNZCyUveuRIhxo8noo18EPhf8PQU8GXpvfzC2DDO70sxmzGzm4MGDhQQYFL2zeeMU92+9sNdkftCkk7QKj+taMcghffVFZzKxwpaNf+/ZI7EVT5OUXRV9o6OumVQDqQgqYy1EtTSiFMzsPcAR4NbuUMRhkfOou9/k7tPuPr1u3bpCcpQ9QeZxLg86Z/PGKX7guOUbuoVFj51gk5RdmSW/wzL2XzOvEuynv/T3mtXROySFyApRDrVHH5nZFXQc0K/yo23f9gOnhA47GThQtSx5o3fijo/yQ4TJW+Rt7tBC5HjcBDvIH1JFclneGkhJRPkPJlYYEyuNhcWjd1JlrIUoj1qVgpm9Fng38JPufij01k7gk2b2QTqO5tOBB+qQKcsEOcjJ2b3OdTv3MTe/dCIv0vw9a9hrG0pNlFGdNMp/sPCcs2ZyguOPXaXoIyEqoMqQ1NuA84G1ZrYfuJZOtNGxwOfNDGCXu/+Su+8zszuAh+mYld5edeRRHgY5Obu7iO/OL7BmcgKzziq/6MSVZ4JtutREGYopbif03fkF9l77mlLkFEIspcroo8sjhj+WcPz1wPVVyVMGSU7O/l3E3PwCkxMrufHScwpPzm1Y+UP2/ICiiqnqxEAhxHLGPqM5C3GT1Aoz3vvZfZWGSla58q+68F9e1AZTiPpRQbwMREUrASy680yCM7g/giYulLQJ6ij8l5cqIqWEEMmM7U4hT6mE7vtRPQbiOGFyotUZuHUV/stL074RIcaNsdwppF0dR7F54xTPpVQIkxMrMaO2FXaeHUmWwn9RyL4vxGgxlkqhqCkkbiJcMzmxzNSRNccgL3kVXdrJvopMaCFE+xhLpVDUFBI3QV735rOXlcWoa4WdV9Glnez77ftrJic4bmIF79y+t3V+EiFEfsZSKeSZqMOmmRvufpRLzp1K5QCta4WdV9F1J/s1oQJ7x01EPxbdWlA3XnoOh488xzOHFjKb34QQ7WYsHc1ZQx2jwjHv3D2bKhIma45B3l4BRWP6Dx95rvf3M4cWEp3hqlQqxOgylkohy0S9Y89sZLRRlkkwbQRNkVyAIjH9WSd5VSoVYnQZS6UA6XsjX/OZh2LDT8ueBIuswItkPWed5JVpLMToMrZKIQ1JrSuh/Emw6Ao8b0x/1klemcZCjC5j6WhOS9JkXMUk2FQuQFym9qGYRj7KNBZidNFOIYG4FfRKs0omwaZW4HElv5Mczso0FmI00U4hgbhw0t/72X9eaEKMyzxucgW+eeMUxx+7fI1QdX0jIUS70E4hgSpKVqdp1NPUClxRRUIIKYUBlD1JtznGX1FFQgiZj2qmzatx1TcSQkgp1Eybq40qqkgIIfNRzbQ9xl9RRUKMN1IKNdOWfstCCBGFlEIDZKmFJOUhhKgTKYWWUqQ4nhBC5EWO5pZStDucEELkQUqhpbQ5dFUIMbrIfNRSiiSSyRchhMiLdgotJW8iWdcXMTs3r1aZQojMaKcQQRtW2nlDV9tcRkMI0X6kFPpoU9RPnkQy+SKEEEWQ+aiPYY/6aXMZDSFE+5FS6GPYV9oqaieEKEJlSsHMbjazp8zsK6Gx55vZ583sq8HvE0PvXWNmj5nZo2Z2UVVyDWLYV9oqaieEKIK5ezUXNnsl8E/AJ9z9pcHY7wJPu/s2M9sKnOju7zazs4DbgPOAk4AvAGe4+2LM5QGYnp72mZmZUuXu9ylAZ6WtiVUIMSqY2W53n456r7Kdgrt/EXi6b/hi4OPB3x8HNofGb3f3w+7+OPAYHQVRO1ppCyHGmbqjj17o7t8CcPdvmdkLgvEpYFfouP3B2DLM7ErgSoD169dXIqTKRwshxpW2OJotYizSruXuN7n7tLtPr1u3rmKxhBBivKhbKXzbzF4EEPx+KhjfD5wSOu5k4EDNsgkhxNhTt1LYCVwR/H0F8Geh8cvM7Fgz2wCcDjxQs2xCCDH2VOZTMLPbgPOBtWa2H7gW2AbcYWZvA54AfgbA3feZ2R3Aw8AR4O2DIo+EEEKUT2VKwd0vj3nrVTHHXw9cX5U8QgghBtMWR7MQQogWIKUghBCih5SCEEKIHlIKQgghekgpCCGE6CGlIIQQooc6rzVIG9p+CiFEGCmFhmhT208hhOgi81FDDHvbTyHEaCKl0BDD3vZTCDGaSCk0xLC3/RRCjCZSCg1x9UVnMjmxcsnY5MRKrr7ozIYkEkIIOZobo+tMVvSREKJNSCk0iNp+CiHahsxHQgghekgpCCGE6CGlIIQQooeUghBCiB5SCkIIIXqYuzctQ27M7CDwzQKXWAt8pyRxqmRY5IThkXVY5IThkXVY5IThkbUqOX/E3ddFvTHUSqEoZjbj7tNNyzGIYZEThkfWYZEThkfWYZEThkfWJuSU+UgIIUQPKQUhhBA9xl0p3NS0ACkZFjlheGQdFjlheGQdFjlheGStXc6x9ikIIYRYyrjvFIQQQoSQUhBCCNFjJJWCma0xs0+b2SNm9rdm9goze76Zfd7Mvhr8PjHm3Nea2aNm9piZbW1I1huC1182sz81szUx537DzB4ys71mNtOAnNeZ2Wzw+XvN7PUx57bhnm4PyfkNM9sbc24t99TMzgzJs9fM/p+ZbWnjc5oga6ue0wQ5W/ecJsja/HPq7iP3A3wc+HfB38cAa4DfBbYGY1uB90ectxL4GnBacN6DwFkNyPoaYFUw9v4oWYP3vgGsbfCeXgf8xoDzWnFP+97/PeC3mr6nfffo74EfaetzGiNr657TGDlb+ZxGydo33shzOnI7BTN7HvBK4GMA7v6su88BF9OZLAh+b444/TzgMXf/urs/C9wenFerrO5+j7sfCQ7bBZxclQxpSLinaWjFPQ29b8DPArdVJUMOXgV8zd2/SQuf0z56srbtOe0jfE/T0Ip72h1o8jkdOaVAR9MfBP6Hme0xsz82s+OBF7r7twCC3y+IOHcKeDL0en8wVresYX4R+FzM+Q7cY2a7zezKhuR8R2A+uDnG1NG2e/oTwLfd/asx59d1T8NcxtH//G18TsOEZQ3Thuc0TL+cbXtOw0Td08ae01FUCquAHwf+0N03At+jsw1Pg0WMVRmzmyirmb0HOALcGnP+Jnf/ceB1wNvN7JU1y/mHwIuBc4Bv0dnu9tOqewpcTvLqq657CoCZHQO8GfhUltMixiqPLY+TtUXPaZycbXxOOx8a/+/f2HM6ikphP7Df3f86eP1pOpPEt83sRQDB76dizj0l9Ppk4EADsmJmVwBvBN7qgRGxH3c/EPx+CvhTOlvg2uR092+7+6K7Pwd8NObz23RPVwFvAbbHnVzjPe3yOuBL7v7t4HUbn9Mu/bK27TmNlLOlz2mXqHva6HM6ckrB3f8eeNLMzgyGXgU8DOwErgjGrgD+LOL0vwFON7MNgQa/LDivVlnN7LXAu4E3u/uhqHPN7Hgz+8Hu33Scfl+pWc4XhQ776ZjPb8U9Df5+NfCIu++POrfOexqif0XYuuc0xBJZ2/acJsjZuuc0RNSOoNnntA7vet0/dLaJM8CXgR3AicAPAf8b+Grw+/nBsScBfx469/XA39GJRHhPQ7I+Rse+uTf4+aN+WenYzh8MfvZVLWuMnH8CPBSM7QRe1NZ7GozfAvxS37FN3tPVwD8AJ4TG2vqcRsnaxuc0Ss62PqfLZG3Dc6oyF0IIIXqMnPlICCFEfqQUhBBC9JBSEEII0UNKQQghRA8pBSGEED2kFMTYYWb/1Pf6583swwPOefOgyplmdr6Z/c+Y97aY2eqEcz9tZqcFf/+5xVQcDR3/ATO7MOkYIfIgpSBECtx9p7tvK3CJLXTi0pdhZmcDK93968Fnvd4HFxz8A9KXbxEiNVIKQoQws3VmdqeZ/U3wsykY7+0mzOzFZrYreP99fTuPH7CjvRxutQ5X0Uk+us/M7ov42LcSylwOauWvNbNTrdMP4qNmts/M7jGzSQDvVNT8ITP74aruhRhPpBTEODJpoQYnwPtC730IuNHdXwZcAvxxxPkfAj4UHNNfH2cjnV3BWXQyTze5+38LjrvA3S+IuN4mYHeMrKcD/93dzwbmApm6fCk4V4jSWNW0AEI0wLy7n9N9YWY/D0wHL18NnNUpZw/A87p1ZkK8gqN9Dj4JfCD03gMe1KwJFM6pwF8OkOdFdMp9R/G4u+8N/t4dXK/LU3R2IEKUhpSCEEtZAbzC3efDgyElMYjDob8XSfd/bB44LuX1JkOvjwvOFaI0ZD4SYin3AO/ovjCzcyKO2cVRM85lKa/7j0D/jqPL3wL/LOV1wpxB9RVHxZghpSDEUq4CpoMuXQ8DvxRxzBbg183sATqmn++muO5NwOdiHM13AednEdLMJugoknKbtouxR1VShchIkG8w7+5uZpcBl7t77n6+QUTRfXSc0ospz/lpOo2O/nPezxUiCvkUhMjOucCHreNomKPTnzg37j5vZtfS6Qn8RMrTVhHdVlKIQminIIQQood8CkIIIXpIKQghhOghpSCEEKKHlIIQQogeUgpCCCF6/H/BHTJDxkPpFAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "measurements = np.array([heights, weights])\n",
    "plt.scatter(measurements[0], measurements[1])\n",
    "plt.xlabel('Height (in)')\n",
    "plt.ylabel('Weight (lb)')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As expected, the height and weight axes are scaled differently. As a reminder, Matplotlib manipulates its 2D axes to make the final plot aesthetically pleasing. Normally, this is a good thing. However, we’ll soon be rotating the plot, in order to simplify our data. The rotation will shift the axes-scaling, making it difficult to compare. Consequently, we should equalize our axes to obtain a consistent visual output. \n",
    "\n",
    "**Plotting 2D measurements using equally-scaled axes**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(measurements[0], measurements[1])\n",
    "plt.xlabel('Height (in)')\n",
    "plt.ylabel('Weight (lb)')\n",
    "plt.axis('equal')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Our plot now forms a thin, cigar-like shape. If the cigar-shaped plot is positioned horizontally, then we could separate it into 3 parts, using 2 vertical slices.\n",
    "\n",
    "We'll now attempt to cluster our 2D data by flipping the data on its side. This horizontal rotation will allow us to bloth cluster the data and also reduce it down to 1-dimension. \n",
    "\n",
    "### 14.1.1 Reducing Dimensions Using Rotation\n",
    "\n",
    "In order to flip our data on its side, we must execute two separate steps:\n",
    "\n",
    "1.\tWe must shift all of our data-points so that they are centered on the origin of the plot, which is located at coordinate (0, 0). This will make it easier to rotate the plot towards the x-axis.\n",
    "2.\tWe must rotate the plotted data until the total distance of the data-points to the x-axis is minimized.\n",
    "\n",
    "We'll start be shifting our data to the origin, by subtracting the mean height and the meean weight.\n",
    "\n",
    "**Listing 14. 5. Centering the measurements at the origin**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "centered_data = np.array([heights - heights.mean(),\n",
    "                          weights - weights.mean()])\n",
    "plt.scatter(centered_data[0], centered_data[1])\n",
    "plt.axhline(0, c='black')\n",
    "plt.axvline(0, c='black')\n",
    "plt.xlabel('Centralized Height (in)')\n",
    "plt.ylabel('Centralized Weight (lb)')\n",
    "plt.axis('equal')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Our data is now perfectly centered at the origin. We want to spin the plotted points around the origin, until they overlap with the x-axis. Rotating a 2D plot around its center requires the use of a **rotation matrix**. A rotation matrix is a 2-by-2 array of the form `np.array([[cos(x), -sin(x)], [sin(x), cos(x)]])`, where `x` is the angle of rotation. The matrix product of this array and `centered_data` will rotate the data by `x` radians. \n",
    "\n",
    "Lets utilize the rotation matrix to rotate `centered_data` clockwise by 90 degrees.\n",
    "\n",
    "**Listing 14. 6. Rotating `centered_data` by 90 degrees**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from math import sin, cos\n",
    "angle = np.radians(-90)\n",
    "rotation_matrix = np.array([[cos(angle), -sin(angle)], \n",
    "                            [sin(angle), cos(angle)]])\n",
    "\n",
    "rotated_data = rotation_matrix @ centered_data\n",
    "plt.scatter(centered_data[0], centered_data[1], label='Original Data')\n",
    "plt.scatter(rotated_data[0], rotated_data[1], c='y', label='Rotated Data')\n",
    "plt.axhline(0, c='black')\n",
    "plt.axvline(0, c='black')\n",
    "plt.legend()\n",
    "plt.axis('equal')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "our rotation has shifted the plot closer to the x-axis. We need a way to quantify this shift. Lets generate a penalty score that will decrease as the data is rotated towards the x-axis. \n",
    "\n",
    "We'll penalize all vertical y-axis values. Our penalty will be based on the concept of squared distance, which we introduced in Section Five. The penalty square will equal the average squared y-value of `rotated_data`. When a rotated dataset moves closer to the x-axis, its average squared y-value will decrease. \n",
    "\n",
    "**Listing 14. 7. Penalizing vertical y-values**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The penalty score for the unrotated data is 519.82\n",
      "The penalty score for the rotated data is 27.00\n"
     ]
    }
   ],
   "source": [
    "data_labels = ['unrotated', 'rotated']\n",
    "data_list = [centered_data, rotated_data]\n",
    "for data_label, data in zip(data_labels, data_list):\n",
    "    y_values = data[1]\n",
    "    penalty = y_values @ y_values / y_values.size\n",
    "    print(f\"The penalty score for the {data_label} data is {penalty:.2f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Rotating the data has reduced the penalty score by more than 20-fold. Furthermore, we can mathematically show that penalty score is equal to the y-axis variance (`y_values.var()`). Consequently, our data rotation has reduced the y-axis variance by more than 20-fold. We'll confirm below.\n",
    "\n",
    "**Listing 14. 8. Equating penalties with y-axis variance**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The y-axis variance for the unrotated data is 519.82\n",
      "The y-axis variance for the rotated data is 27.00\n"
     ]
    }
   ],
   "source": [
    "for data_label, data in zip(data_labels, data_list):\n",
    "    y_var = data[1].var()\n",
    "    penalty = data[1] @ data[1] / data[0].size\n",
    "    assert round(y_var, 14) == round(penalty, 14)\n",
    "    print(f\"The y-axis variance for the {data_label} data is {y_var:.2f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can score rotations based on variance. Rotating the data towards the x-axis reduces the variance along the y-axis. How does this rotation influence the variance along the x-axis? Lets find out.\n",
    "\n",
    "**Listing 14. 9. Measuring rotational x-axis variance**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The x-axis variance for the unrotated data is 27.00\n",
      "The x-axis variance for the rotated data is 519.82\n"
     ]
    }
   ],
   "source": [
    "for data_label, data in zip(data_labels, data_list):\n",
    "    x_var = data[0].var()\n",
    "    print(f\"The x-axis variance for the {data_label} data is {x_var:.2f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The rotation has completely flipped the x-axis variance and the y-axis variance. However, the total sum of variance-values has remaine unchanged. Total variance is conserved, even after the rotation. We'll verify this fact below.\n",
    "\n",
    "**Listing 14. 10. Confirming the conservation of total variance**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [],
   "source": [
    "total_variance = centered_data[0].var() + centered_data[1].var()\n",
    "assert total_variance == rotated_data[0].var() + rotated_data[1].var()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Conservation of variance allows us to infer the following:\n",
    "\n",
    "* x-axis variance and y-axis variance can be combined into a single percentage-score, where `x_values.var() / total_variance` is equal to `1 - y_values.var() / total_variance`. \n",
    "* Rotating the data towards the x-axis will lead to an increase in the x-axis variance, and to an equivalent decrease in y-axis variance.\n",
    "\n",
    "The following code confirms all these conclusions.\n",
    "\n",
    "**Listing 14. 11. Exploring the percent coverage of axis-variance**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "In the unrotated data, 4.94% of the total variance is distributed across the x-axis\n",
      "The remaining 95.06% of the total variance is distributed across the y-axis\n",
      "\n",
      "In the rotated data, 95.06% of the total variance is distributed across the x-axis\n",
      "The remaining 4.94% of the total variance is distributed across the y-axis\n",
      "\n"
     ]
    }
   ],
   "source": [
    "for data_label, data in zip(data_labels, data_list):\n",
    "    percent_x_axis_var = 100 * data[0].var() / total_variance\n",
    "    percent_y_axis_var = 100 * data[1].var() / total_variance\n",
    "    print(f\"In the {data_label} data, {percent_x_axis_var:.2f}% of the \"\n",
    "           \"total variance is distributed across the x-axis\")\n",
    "    print(f\"The remaining {percent_y_axis_var:.2f}% of the total \"\n",
    "           \"variance is distributed across the y-axis\\n\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Lets rotate `centered_data` even further, until its distance to the x-axis is minimized. Minimizing the distance to the x-axis is equivalent to maximizing the percent of total variance covered by the x-axis.\n",
    "\n",
    "**Listing 14. 12. Maximizing horizontal dispersion**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The horizontal variance is maximized to approximately 541 after a 78.3 degree rotation.\n",
      "That rotation distributes 99.08% of the total variance onto the x-axis.\n"
     ]
    }
   ],
   "source": [
    "def rotate(angle, data=centered_data):\n",
    "    angle = np.radians(-angle)\n",
    "    rotation_matrix = np.array([[cos(angle), -sin(angle)], \n",
    "                                [sin(angle), cos(angle)]])\n",
    "    return rotation_matrix @ data\n",
    "\n",
    "angles = np.arange(1, 180, 0.1)\n",
    "x_variances = [(rotate(angle)[0].var()) for angle in angles]\n",
    "\n",
    "percent_x_variances = 100 * np.array(x_variances) / total_variance \n",
    "optimal_index = np.argmax(percent_x_variances)\n",
    "optimal_angle = angles[optimal_index]\n",
    "plt.plot(angles, percent_x_variances)\n",
    "plt.axvline(optimal_angle, c='k')\n",
    "plt.xlabel('Angle (degrees)')\n",
    "plt.ylabel('% x-axis coverage')\n",
    "plt.show()\n",
    "\n",
    "max_coverage = percent_x_variances[optimal_index]\n",
    "max_x_var = x_variances[optimal_index]\n",
    "\n",
    "print(\"The horizontal variance is maximized to approximately \"\n",
    "      f\"{int(max_x_var)} after a {optimal_angle:.1f} degree rotation.\")\n",
    "print(f\"That rotation distributes {max_coverage:.2f}% of the total \"\n",
    "       \"variance onto the x-axis.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Rotating `centered_data` by 78.3 degrees will maximize the horizontal dispersion. At that rotation angle, 99.08% of the total variance will be distributed across the x-axis. Thus, we can expect the rotated data to mostly lie along the 1D axis line. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "best_rotated_data = rotate(optimal_angle)\n",
    "plt.scatter(best_rotated_data[0], best_rotated_data[1])\n",
    "plt.axhline(0, c='black')\n",
    "plt.axvline(0, c='black')\n",
    "plt.axis('equal')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Most of the data lies close to the x-axis. Consequently, we can delete all y-axis coordinates with minimal information loss.  Lets reduce `best_rotated_data` to 1D by disposing of the y-axis. Afterwards, we'll leverage the remaining 1D array to extract 2 clustering thresholds. The first threshold will separate the small-sized customers from the medium-sized customers. The second threshold will separate the medium-sized customers from the large-sized customers. \n",
    "\n",
    "**Listing 14. 14. Reducing the rotated data to 1D for the purposes of clustering**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "A 1D threshold of -14.61 separates the small-sized and medium-sized customers.\n",
      "A 1D threshold of 15.80 separates the medium-sized and large-sized customers.\n"
     ]
    }
   ],
   "source": [
    "x_values = best_rotated_data[0]\n",
    "sorted_x_values = sorted(x_values)\n",
    "cluster_size = int(x_values.size / 3)\n",
    "small_cutoff = max(sorted_x_values[:cluster_size])\n",
    "large_cutoff = min(sorted_x_values[-cluster_size:])\n",
    "print(f\"A 1D threshold of {small_cutoff:.2f} separates the small-sized \"\n",
    "       \"and medium-sized customers.\")\n",
    "print(f\"A 1D threshold of {large_cutoff:.2f} separates the medium-sized \"\n",
    "      \"and large-sized customers.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can visualize our thresholds by utilizing them to vertically slice our `best_reduced_data` plot. The 2 slices will split the plot into 3 segments. Each segment will correspond to a customer size.\n",
    "\n",
    "**Listing 14. 15. Plotting horizontal customer data separated out into the segments**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_customer_segments(horizontal_2d_data):\n",
    "    small, medium, large = [], [], []\n",
    "    cluster_labels = ['Small', 'Medium', 'Large']\n",
    "    for x_value, y_value in horizontal_2d_data.T: \n",
    "        if x_value <= small_cutoff:\n",
    "            small.append([x_value, y_value])\n",
    "        elif small_cutoff < x_value < large_cutoff:\n",
    "            medium.append([x_value, y_value])\n",
    "        else:\n",
    "            large.append([x_value, y_value])\n",
    "    \n",
    "    for i, cluster in enumerate([small, medium, large]):\n",
    "        cluster_x_values, cluster_y_values = np.array(cluster).T\n",
    "        plt.scatter(cluster_x_values, cluster_y_values,\n",
    "                    color=['g', 'b', 'y'][i],\n",
    "                    label=cluster_labels[i])\n",
    "    \n",
    "    plt.axhline(0, c='black')\n",
    "    plt.axvline(large_cutoff, c='black', linewidth=3, linestyle='--')\n",
    "    plt.axvline(small_cutoff, c='black', linewidth=3, linestyle='--')\n",
    "    plt.axis('equal')\n",
    "    plt.legend()\n",
    "    plt.show()\n",
    "\n",
    "plot_customer_segments(best_rotated_data)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Our 1D `x_values` array can sufficiently segment the customer data, because it captures 99.08% of the data’s variance. Consequently, we can leverage the array to reproduce 99.08% of our `centered_data` dataset. We simply need to reintroduce the y-axis dimension. Afterwards, we'll need to rotate the resulting array back to its original position.\n",
    "\n",
    "**Listing 14. 16. Reproducing 2D data from a 1D array**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [],
   "source": [
    "zero_y_values = np.zeros(x_values.size)\n",
    "reproduced_data = rotate(-optimal_angle, data=[x_values, zero_y_values])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Lets plot `reproduced_data` together with the our `centered_data` matrix in order to gage the quality of the reproduction.\n",
    "\n",
    "**Listing 14. 17. Plotting reproduced and original data**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(reproduced_data[0], reproduced_data[1], c='k', \n",
    "         label='Reproduced Data')\n",
    "plt.scatter(centered_data[0], centered_data[1], c='y', \n",
    "            label='Original Data')\n",
    "plt.axis('equal')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The reproduced data forms a line, which cuts directly through the middle of the `centered_data` scatter-plot. The line represents the **first principal direction** of our data. We can leverage the first principal direction to process the heights and weights of future customers. We'll assume that these customers originate from the same distribution that underlies our existing `measurements` data. If so, then their centralized heights and weights will also lie along the first principal direction. Lets explore this scenario more concretely by simulating new customer measurements. \n",
    "\n",
    "**Listing 14. 18. Simulating and plotting new customer data**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYcAAAEGCAYAAACO8lkDAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAA0CElEQVR4nO3deXxU5fX48c9JAgnIUggYpCwhCMgSNuNCQQW1gEABvy4vNbZQtamobWnVqqXV1n5p/Sq/uhZbrFbbpi7FpUpdgAqusSyWRSEDGHYwQpRFlkiS8/vj3hkms2WAzNxJct6vV17J3HvnzuGSzJnnPs9zHlFVjDHGmGBpXgdgjDEm9VhyMMYYE8aSgzHGmDCWHIwxxoSx5GCMMSZMhtcB1IcOHTpobm6u12EYY0yDsnz58t2q2jHSvkaRHHJzc1m2bJnXYRhjTIMiIpuj7bPbSsYYY8JYcjDGGBPGkoMxxpgwjaLPIZIjR46wbds2Dh8+7HUoppHJysqiS5cuNGvWzOtQjEmYRpsctm3bRuvWrcnNzUVEvA7HNBKqSkVFBdu2baNHjx5eh2NMwjTa20qHDx8mOzvbEoOpVyJCdnZ2wluk5eXFlJTksnhxGiUluZSXFyf09YwJ1WhbDoAlBpMQif69Ki8vxucroqbmIACVlZvx+YoAyMkpTOhrG+PXaFsOxjRUZWUzAonBr6bmIGVlMzyKyDRFlhwSKD09ncGDBwe+Nm3axDe+8Y1jOscDDzzAwYMHI+4bOXIkffr0YdCgQQwfPhyfzxfxuOuuu441a9Ycc/zAMccbGl+kyYn+uAcOHMhpp53GTTfdxJ49e+rlNYM9+eST7NixI/D4RK5DMlVWbjmm7cYkgiWHBGrRogUrVqwIfOXm5vL++++HHVddXR31HLGSA0BxcTErV65kypQp3HrrrRHP/ac//Yl+/fod178hUrz1obi4mFWrVrFq1SoyMzOZNGlSzNeMdY2iCU0OJ3Idkikzs9sxbTcmESw5JFmrVq0AWLx4MaNGjeKqq64iPz+fAwcOMH78eAYNGsSAAQN49tlneeihh9ixYwejRo1i1KhRMc977rnnsmHDhsBr3HnnnZx11lmUlJTU+gTfqlUrZsyYwaBBgzj77LMpLy8HoLy8nIsvvphBgwYxaNCgwBt0cLznnnsuF198Mf369eP666+npqYGgGnTplFQUED//v256667jul6NG/enHvvvZctW7awcuXKmNeourqaW2+9lTPOOIOBAwfyxz/+MXCee++9l/z8fAYNGsTtt9/O3LlzWbZsGYWFhQwePJhDhw7Vug5PP/00+fn5DBgwgNtuu63W/0+k65NMeXkzSUtrWWtbWlpL8vJmJj0W03Q16g5pv+nTp7NixYp6PefgwYN54IEHYh5z6NAhBg8eDECPHj148cUXa+1fsmQJH330ET169OD555+nc+fO/Otf/wJg7969tG3blt/97ncsWrSIDh06xHytV155hfz8fAAOHDjAgAEDuPvuu8OOO3DgAGeffTYzZ87kpz/9KY899hg///nP+eEPf8h5553Hiy++SHV1NV9++WXYc5csWcKaNWvo3r07Y8eO5YUXXuDSSy9l5syZtG/fnurqai644AJWrVrFwIEDY8YbLD09nUGDBlFaWsqgQYOiXqM5c+bQtm1bli5dSmVlJcOHD2f06NGUlpby0ksv8Z///IeWLVvy+eef0759ex555BFmzZpFQUFBrXPu2LGD2267jeXLl9OuXTtGjx7NSy+9xOTJk6Nen2TydzqXlc2gsnILmZndyMubaZ3RJqmaRHLwiv+2UjRnnnlmYKx8fn4+t9xyC7fddhsTJkzgnHPOies1CgsLadGiBbm5uTz88MOA82Z7ySWXRDy+efPmTJgwAYDTTz+dBQsWAPDmm2/yl7/8JfD8tm3bRow3Ly8PgCuvvJJ3332XSy+9lOeee445c+ZQVVXFzp07WbNmzTElB3DmD0QSfI3mz5/PqlWrmDt3LuAk0PXr17Nw4UK++93v0rKl82m7ffv2MV9r6dKljBw5ko4dnWKUhYWFvP3220yePDnq9Um2nJxCSwbGU00iOdT1Cd8rJ510UuDn3r17s3z5cl599VXuuOMORo8ezZ133lnnOYqLi8M+GWdlZZGenh7x+GbNmgWGYqanp1NVVRV3vKFDOEWEjRs3MmvWLJYuXUq7du2YOnXqMc8BqK6uZvXq1fTt2zdsX/A1UlUefvhhxowZU+uY119//ZiGl0ZLRHBi18eYxsT6HFLEjh07aNmyJVdffTW33HILH374IQCtW7dm//79CX/9Cy64gEcffRRw3qz37dsXdsySJUvYuHEjNTU1PPvss4wYMYJ9+/Zx0kkn0bZtW8rLy3nttdeO6XWPHDnCHXfcQdeuXetsbYwZM4ZHH32UI0eOALBu3ToOHDjA6NGjeeKJJwId959//jkQ/dqdddZZvPXWW+zevZvq6mqefvppzjvvvGOK25jGrkm0HBqC1atXc+utt5KWlkazZs0Cb9RFRUVcdNFFnHLKKSxatChhr//ggw9SVFTE448/Tnp6Oo8++ijDhg2rdcywYcO4/fbbWb16daBzOi0tjSFDhtC/f3/y8vIYPnx4XK9XWFhIZmYmlZWVXHjhhfzzn/+s8znXXXcdmzZtYujQoagqHTt25KWXXmLs2LGsWLGCgoICmjdvzrhx4/jNb37D1KlTuf7662nRogUlJSWB85xyyin89re/ZdSoUagq48aNqzVayhgDEquJ3VAUFBRo6Hj6tWvXRrxNYY7P4sWLmTVrFvPmzfM6lJRgv1+mMRCR5apaEGmf3VYyxhgTxpKDicvIkSOt1eCh//73v7XmYxiTaJYcjGkAhg4dyr333ntcM8WNOR6WHIxpQKINUTamvllyMCbF2WqGxguWHIxJcf/4xz8AGD9+vMeRmKbEkkMCiQg333xz4PGsWbP45S9/Wa+vsW7dOsaNG8epp55K3759ufzyy4+rWFxoBVMv1FXKO5rf/OY3iQ/OQ7Nnzwbghhtu8DgS05RYckigzMxMXnjhBXbv3p2Q8x8+fJjx48czbdo0NmzYwNq1a5k2bRq7du065nMlOzmoaqCqa7BYpbyjaezJ4YMPPgAIKxtiTCJZcnAlYs3ejIwMioqKuP/++8P27dq1i0suuYQzzjiDM844g/feew9wCvDt2bMHVSU7OztQDO/b3/42CxcurHWOv//97wwbNoxvfetbgW2jRo1iwIABPPnkk9x0002B7RMmTGDx4sVUV1czdepUBgwYQH5+Pvfff3/E8tb//ve/GTJkCPn5+VxzzTVUVlYCkJuby89+9jOGDRtGQUEBH374IWPGjKFnz5784Q9/CLzefffdFyit7S/jvWnTJvr27csNN9zA0KFD2bp1a9RrF6mU9+TJkzn99NPp378/c+bMAeD2228PVL8tLCyMelxjYJ3RJqlUtcF/nX766RpqzZo1Ydui+fTTv+lbb7XURYsIfL31Vkv99NO/xX2OSE466STdu3evdu/eXffs2aP33Xef3nXXXaqqeuWVV+o777yjqqqbN2/W0047TVVVv//97+u8efN09erVWlBQoNddd52qqp566qm6f//+Wuf/8Y9/rA888EDE1/7zn/+sN954Y+Dx+PHjddGiRbps2TK98MILA9u/+OILVVU977zzdOnSpaqqeujQIe3SpYv6fD5VVf32t7+t999/v6qqdu/eXWfPnq2qqtOnT9f8/Hzdt2+ffvbZZ9qxY0dVVX3jjTf0e9/7ntbU1Gh1dbWOHz9e33rrLd24caOKiJaUlESMOTgGv0mTJukzzzyjqqoVFRWqqnrw4EHt37+/7t69O3Cdg0U7rj4dy+/Xifjiiy8UUOdP1Zj6BSzTKO+rnrccRCRdRP4rIvPcx+1FZIGIrHe/t0t0DIlcs7dNmzZ85zvf4aGHHqq1feHChdx0000MHjyYiRMnsm/fPvbv388555zD22+/zdtvv820adNYvXo127dvp3379oFFcE5EXl4eZWVl/OAHP+D111+nTZs2Ycf4fD569OhB7969AZgyZQpvv/12YP/EiRMBp5Vz1lln0bp1azp27EhWVhZ79uxh/vz5zJ8/nyFDhjB06FBKS0tZv349AN27d+fss8+OO14NKu/y0EMPBRbh2bp1a+CcoeI9LpX5W7I//7nz63/ppSM8jsg0NZ4nB+BHwNqgx7cD/1bVXsC/3ccJleg1e6dPn87jjz/OgQMHAttqamooKSkJLCG6fft2Wrduzbnnnss777zDO++8E1hzYO7cuRHXd+jfvz/Lly+P+JoZGRm17un7h0O2a9eOlStXMnLkSH7/+99z3XXXhT03+A05kszMTADS0tICP/sfV1VVoarccccdgX/bhg0buPbaa4HaJbjrElzKe/HixSxcuJCSkhJWrlzJkCFDIg7xjPe4VFZeXozPV0Rl5WZeftnZdv75S+vlVqcx8fI0OYhIF2A88KegzZOAp9yfnwImJzqORK/Z2759ey6//HIef/zxwLbRo0fzyCOPBB77FwXq2rUru3fvZv369eTl5TFixAhmzZoVMTlcddVVvP/++4HV48BZ22D16tXk5uayYsUKampq2Lp1K0uWLAFg9+7d1NTUcMkll/DrX/86Ymnw0047jU2bNgWWHf3rX/96TCWtx4wZwxNPPBFYTW779u189tlncT8fwkt57927l3bt2tGyZUtKS0sDnbTgrMHgL+Md67iGIrgl6++WOe20ynppyRoTL69bDg8APwWCh63kqOpOAPf7yYkOIhlr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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "np.random.seed(1)\n",
    "new_heights = np.arange(60, 78, .11) \n",
    "random_fluctuations = np.random.normal(scale=10, size=new_heights.size)\n",
    "new_weights =  4 * new_heights - 130 + random_fluctuations\n",
    "new_centered_data = np.array([new_heights - heights.mean(),\n",
    "                              new_weights - weights.mean()])\n",
    "plt.scatter(new_centered_data[0], new_centered_data[1], c='y', \n",
    "            label='New Customer Data')\n",
    "plt.plot(reproduced_data[0], reproduced_data[1], c='k', \n",
    "         label='First Principal Direction')\n",
    "plt.xlabel('Centralized Height (in)')\n",
    "plt.ylabel('Centralized Weight (lb)')\n",
    "plt.axis('equal')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Our new customer data continues to lie along the first principal direction. Consequently, we can flip our new data on its side by rotating it 78.3 degrees. The resulting horizontal x-values will cover more than 99% of the total variance. The high horizontal dispersion will permit us to segment our customers by size without relying on y-value information. \n",
    "\n",
    "**Listing 14. 19. Rotating and segmenting our new customer data**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "new_horizontal_data = rotate(optimal_angle, data=new_centered_data)\n",
    "plot_customer_segments(new_horizontal_data)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Thus far, we have extracted the first principal direction by rotating our data so as to maximize the variance. Unfortunately, this technique will not scale to higher dimensions. Fortunately, there's an easier way to extract all principal directions. We just need to apply scalable algorithm known as **Principal Component Analysis**. That algorithm’s name is commonly shortened to **PCA**.\n",
    "\n",
    "## 14.2. Dimension Reduction Using PCA and Scikit-Learn\n",
    "\n",
    "Scikit-Learn provides a Principal Component Analysis class called `PCA`. Lets import `PCA` from `sklearn.decomposition`.\n",
    "\n",
    "**Listing 14. 20. Importing PCA from Scikit-Learn**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.decomposition import PCA"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next, we'll initialize `PCA`.\n",
    "\n",
    "**Listing 14. 21. Initializing a `pca_model` object**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [],
   "source": [
    "pca_object = PCA()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We’ll now apply `PCA` to our `measurements` array in order to horizontally orient that data. Afterwards, we'll plot the columns of the resulting `pca_transformed_data` matrix. The plot of the two columns should resemble a cigar that’s lying on its side\n",
    "\n",
    "**Listing 14. 22. Running PCA using Scikit-Learn**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "pca_transformed_data = pca_object.fit_transform(measurements.T)\n",
    "plt.scatter(pca_transformed_data[:,0], pca_transformed_data[:,1])\n",
    "plt.axhline(0, c='black')\n",
    "plt.axvline(0, c='black')\n",
    "plt.axis('equal')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Even though our plotted data is oriented differently, its x-axis variance coverage should still remain consistent with our previous ovservations. We can confirm using the `explained_variance_ratio_` attribute of `pca_object`.\n",
    "\n",
    "**Listing 14. 23. Extracting variance from Scikit-Learn’s PCA output**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The x-axis of our PCA output covers 99.08% of the total variance\n"
     ]
    }
   ],
   "source": [
    "percent_variance_coverages = 100 * pca_object.explained_variance_ratio_ \n",
    "x_axis_coverage, y_axis_coverage = percent_variance_coverages\n",
    "print(f\"The x-axis of our PCA output covers {x_axis_coverage:.2f}% of \"\n",
    "       \"the total variance\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Our `pca_object` has maximized the x-axis variance of the input data. It has done so by uncovering the dataset’s 2 principal directions. These directions are stored as vectors within the `pca.components` attribute (which is itself a matrix). The first principal direction is represented as a vector, which is called  the **first principal component**. \n",
    "\n",
    "**Listing 14. 24. Outputting the first principal component**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Vector [-0.20223994 -0.979336  ] points in a direction that covers 99.08% of the total variance.\n",
      "The vector has a magnitude of 1.0\n"
     ]
    }
   ],
   "source": [
    "from numpy.linalg import norm\n",
    "first_pc = pca_object.components_[0]\n",
    "magnitude = norm(first_pc)\n",
    "print(f\"Vector {first_pc} points in a direction that covers \"\n",
    "      f\"{x_axis_coverage:.2f}% of the total variance.\")\n",
    "print(f\"The vector has a magnitude of {magnitude}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The first principal component is a unit-vector, with a magnitude of 1.0. It stretches one whole unit-length from the origin. If we stretch it far enough, we can capture the entire principal direction of our data.\n",
    "\n",
    "**Listing 14. 25. Stretching a unit-vector to cover the first principal direction**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYcAAAEGCAYAAACO8lkDAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAv/ElEQVR4nO3deXyU5bn/8c+VAQIIRgk0gCghCiiCoI0L0p/iUlRqtZ72nFdtbLXL4afWUz2tVi09WnsOp5s/q120xW60jW2te+tyrAutWoqCB0HNgo2INDIKiChIhOT6/fE8k0wyKyGzZPJ9v17zmplnvRhgrnme+76v29wdERGReGWFDkBERIqPkoOIiCRQchARkQRKDiIikkDJQUREEgwqdAB9YfTo0V5dXV3oMERE+pWVK1ducvcxydaVRHKorq5mxYoVhQ5DRKRfMbNXUq3TbSUREUmg5CAiIgmUHEREJEFJtDkks2vXLjZs2MDOnTsLHYqUmKFDhzJhwgQGDx5c6FBEcqZkk8OGDRsYOXIk1dXVmFmhw5ES4e5s3ryZDRs2MGnSpEKHI5IzJXtbaefOnVRWVioxSJ8yMyorK3N+RRqN1rNsWTVLl5axbFk10Wh9Ts8n0lPJXjkASgySE7n+dxWN1tPUtICOjh0AtLW9QlPTAgCqqupyem6RmJK9chDpr1paFnYmhpiOjh20tCwsUEQyECk55FAkEmHWrFmdj3Xr1nH88cfv0TFuvPFGduzYkXTd3LlzmTp1KjNnzmTOnDk0NTUl3e5zn/scL7744h7HD+xxvD3jSzY4MRb3EUccwaGHHsoll1zC1q1b++Sc8X7xi1/Q2tra+X5vPod8amtbn3L5E088wQsvvJDniGQgUnLIoWHDhrFq1arOR3V1NX/9618Ttmtvb095jHTJAaC+vp7nnnuO888/nyuuuCLpsX/yk58wbdq0Xv0ZksXbF+rr61m9ejWrV6+mvLycs88+O+05031GqfRMDnvzOeRTeflBSZcPGXIgJ5xwAkcccUSeI5KBSMkhz0aMGAHA0qVLOemkk/jEJz7BjBkz2L59Ox/60IeYOXMm06dP53e/+x3f+973aG1t5aSTTuKkk05Ke9wTTjiBl156qfMc11xzDcceeyzLli3r9gt+xIgRLFy4kJkzZ3LccccRjUYBiEajnHPOOcycOZOZM2d2fkHHx3vCCSdwzjnnMG3aNC688EI6OjoAuOiii6itreXwww/n2muv3aPPY8iQIXz7299m/fr1PPfcc2k/o/b2dq644gqOPvpojjjiCH784x93Hufb3/42M2bMYObMmVx11VXccccdrFixgrq6OmbNmsW7777b7XP4zW9+w4wZM5g+fTpXXnllt7+fZJ9PPsQaodvaXgG6t2uUlQ3nzTc/DcCUKVPyFpMMXCXdIB1z2WWXsWrVqj495qxZs7jxxhvTbvPuu+8ya9YsACZNmsTdd9/dbf3TTz/N888/z6RJk7jzzjsZP348999/PwBvvfUWFRUV3HDDDTz++OOMHj067bn+8Ic/MGPGDAC2b9/O9OnT+frXv56w3fbt2znuuONYtGgRX/7yl7n11lv56le/yhe+8AVOPPFE7r77btrb23nnnXcS9n366ad58cUXmThxIqeffjp33XUXH/vYx1i0aBGjRo2ivb2dU045hdWrV+/Rr9tIJMLMmTNpbGxk5syZKT+jxYsXU1FRwTPPPENbWxtz5sxh3rx5NDY2cs8997B8+XKGDx/Oli1bGDVqFD/4wQ+4/vrrqa2t7XbM1tZWrrzySlauXMn+++/PvHnzuOeee/jIRz6S8vPJtZ6N0OAECcIpL59ITc0iLr/8IQAuvvjinMcjoiuHHIq/rdQzMQAcc8wxnX3lZ8yYwSOPPMKVV17JE088QUVFRVbniP0yfuqpp7j++uuB4Mv2ox/9aNLthwwZwplnngnA+9//ftatWwfAY489xkUXXdS5f7LzH3PMMdTU1BCJRDj33HN58sknAbj99ts56qijOPLII3nhhRd6dV8/1Vzm8Z/Rww8/zC9/+UtmzZrFsccey+bNm1m7di2PPPIIn/70pxk+fDgAo0aNSnuuZ555hrlz5zJmzBgGDRpEXV0df/nLX4DUn0+uJWuEjiWG2bPXUVVVx69//WsAPvWpT+UlJhnYBsSVQ6Zf+IWyzz77dL6eMmUKK1eu5IEHHuDqq69m3rx5XHPNNRmPUV9fn/DLeOjQoUQikaTbDx48uLMrZiQSYffu3VnH27MLp5nx8ssvc/311/PMM8+w//77c8EFF+zxGID29nbWrFnDYYcdlrAu/jNyd77//e9z2mmnddvmoYce2qPupakSEezd57M30jVC95TtDweRvaErhyLR2trK8OHDOe+887j88st59tln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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_stretched_vector(v, **kwargs): \n",
    "    plt.plot([-50 * v[0], 50 * v[0]], [-50 * v[1], 50 * v[1]], **kwargs)\n",
    "    \n",
    "plt.plot(reproduced_data[0], reproduced_data[1], c='k', \n",
    "         label='First Principal Direction')\n",
    "plt.scatter(centered_data[0], centered_data[1], c='y')\n",
    "plt.xlabel('Centralized Height (in)')\n",
    "plt.ylabel('Centralized Weight (lb)')\n",
    "plt.axis('equal')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The second principal direction is perpendicular to the first. Its vectorized representation is called the **second principal component**. Both the first and second principal components share a special relationship with the x and y axes of our data. Visually uncovering that relationship will make dimension reduction conceptually easier to comprehend. Hence, we’ll now proceed to stretch and plot both the components within the `components` matrix. Additionally, we’ll plot `centered_data`, as well as both our axes.\n",
    "\n",
    "**Listing 14. 26. Plotting all principal directions, along with axes and data-information**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYcAAAEGCAYAAACO8lkDAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAA5gUlEQVR4nO3deXxU9dX48c+ZBEKQRQ0ShAAhSMJOkEBZBXFH1LrUR8UqVsvTPm2ttfapli7aFmstWqy2VdpaeSwq/qDUpdpal9SKsSYgrskghn0JkCKLgUAy5/fHvRNmMmsgsySc9+s1r8zce+fOyRDmzP0u5yuqijHGGBPIk+oAjDHGpB9LDsYYY0JYcjDGGBPCkoMxxpgQlhyMMcaEyEx1AK2hR48emp+fn+owjDGmTVm5cuUuVT0l3L52kRzy8/OpqKhIdRjGGNOmiMiGSPusWckYY0wISw7GGGNCWHIwxhgTol30ORhjQh0+fJjNmzdz8ODBVIdiUqxTp07k5eXRoUOHuJ9jycGYdmrz5s107dqV/Px8RCTV4ZgUUVVqa2vZvHkzAwYMiPt51qxkTDt18OBBcnJyLDEc50SEnJycFl9BWnIwph2zxGDg6P4OLDkYY4wJYcnBGJMwGRkZFBcXM3z4cL7whS9QV1cX9riJEyce1fkrKiq4+eabjzq+Ll26hN3uj3vYsGGMGjWK+++/H5/P1yqvGejuu+8Oeny070MiSHtY7KekpERthrRJR895nwPgoqKLjvlcP/vZz8jPz+fqq6+O6/jKykqGDBlyzK97LLp06cL+/fsBmDVrFmPGjOHWW29t2t/Y2EhGRkaqwguKL9L2HTt2cM011zBp0iTuuuuuiOdqaGggM7NlY3wivX4ihPt7EJGVqloS7ni7cjAmge4ru4/7yu475vOoKvfeey+lpaXHHlSKTJkyhbVr11JaWsqZZ57JNddcw4gRI4Aj3+BLS0uZNm0aV1xxBYMHD2bWrFn4v8CWl5czceJERo0axbhx49i3bx+lpaXMnDkTgDvvvJMvfvGLTJ8+nUGDBvG73/0OgP3793PWWWdx+umnM2LECJ555pkWxd2zZ08WLlzIQw89hKqGvOacOXM499xzue6669i5cyeXX345Y8eOZezYsaxYsaIphhtuuIERI0YwcuRIli1bxu23386BAwcoLi5m1qxZQe+DqvKd73yH4cOHM2LECJYsWRLz/bn99tsZOnQoI0eO5Lbbbju6f6QANpTVmARaeuXSFh1fU7OY6uq51NdvJCurHwUF88jNncUnn3zCp59+SklJ2C95Md1yyy2sXr36qJ4bSXFxMQsWLIjr2IaGBl588UXOP/98AN5++20++OCDsEMr33nnHT788EN69+7NpEmTWLFiBePGjeO//uu/WLJkCWPHjmXv3r1kZ2eHPPe9997jrbfe4rPPPmP06NFceOGF9OzZk+XLl9OtWzd27drF+PHjufjii1vUSVtQUIDP52PHjh0h+1auXMkbb7xBdnY211xzDd/61reYPHkyGzdu5LzzzqOyspKf/OQndO/enffffx+A3bt3c/nll/PQQw+F/Xf585//zOrVq3n33XfZtWsXY8eO5Ywzzoj4/gwdOpTly5dTVVWFiPDpp5/G/btFYsnBmATq0blH3MfW1CzG652Dz+e0y9fXb8DrnQNAeblzkT927NjWDzKB/N+MwblyuPHGG3nzzTcZN25cxDH348aNIy8vD3AS0Pr16+nevTunnnpq0+/frVu3sM+95JJLyM7OJjs7mzPPPJO3336bCy+8kO9973u8/vrreDwetmzZQk1NDb169WrR7xKpCf7iiy9uSlQvv/wyH330UdO+vXv3sm/fPl5++WWeeuqppu0nnXRS1Nd64403uPrqq8nIyCA3N5epU6dSXl5Ot27dwr4/48ePp1OnTtx0001ceOGFTVc2x8KSgzEJ9NjqxwCYXTw75rHV1XObEoOfz1dHdfVcyssvo1OnTgwbNuyo4oj3G35ry87ODvvN+IQTToj4nKysrKb7GRkZNDQ0oKpxfdNvfoyIsHjxYnbu3MnKlSvp0KED+fn5LR7zX11dTUZGBj179qSysjLi7+Lz+SgrKwu5qok3/sDjIwn3/mRmZvL222/zyiuv8NRTT/HQQw/x6quvxv164VifgzEJ9Njqx5oSRCz19Rsjbi8vL2f06NEtKn/QngwePJitW7dSXl4OwL59+2hoaAg57plnnuHgwYPU1tZSWlrK2LFj2bNnDz179qRDhw689tprbNgQsUp1WDt37uQrX/kKX//612N+wJ977rk89NBDTY/9ibH59t27dwPQoUMHDh8+HHKeM844gyVLltDY2MjOnTt5/fXXGTduXMTX3b9/P3v27GHGjBksWLCgVZoQLTkY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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "principal_components = pca_object.components_\n",
    "for i, pc in enumerate(principal_components):\n",
    "    plot_stretched_vector(pc, c='k', \n",
    "                          label='Principal Directions' if i == 0 else None)\n",
    "    \n",
    "for i, axis_vector in enumerate([np.array([0, 1]), np.array([1, 0])]):\n",
    "    plot_stretched_vector(axis_vector,  c='g', linestyle='-.', \n",
    "                          label='Axes' if i == 0 else None)\n",
    "\n",
    "plt.scatter(centered_data[0], centered_data[1], c='y')\n",
    "plt.xlabel('Centralized Height (in)')\n",
    "plt.ylabel('Centralized Weight (lb)')\n",
    "plt.axis('equal')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The first and second principal directions are essentially a rotated version of the x and y axes. In other words, rotating the data is equivalent to swapping the axes with the principal directions. Swapping our 2 axes for the principal directions is referred to as a **projection onto the principal directions**. Using trigonometry, one can show that the projection of `centered_data` onto the principal directions is equal to the matrix product of `centered_data` and the 2 principal components.\n",
    "\n",
    "**Listing 14. 27. Swapping standard axes for principal directions, using projection**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [],
   "source": [
    "projections = principal_components @ centered_data\n",
    "assert np.allclose(pca_transformed_data.T, projections)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Suppose we project a 4D dataset onto its four principal directions. The dataset’s standard axes will thus be swapped with its principal directions. Under the right circumstances, two of the new axes will cover a good chunk of the variance. Consequently, the remaining axes couldy be discarded, with minimized information loss.\n",
    "\n",
    "## 14.3. Clustering 4D Data in 2-Dimensions\n",
    "\n",
    "Imagine we are botanists, studying flowers in a blooming meadow. We randomly select 150 flowers. For every flower, we record 4 measurements. These 4D flower measurements already exist. We can access them using Scikit-Learn.\n",
    "\n",
    "**Listing 14. 28. Loading flower measurements from Scikit-Learn**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "150 flowers have been measured.\n",
      "4 measurements were recorded for every flower.\n",
      "The first flower has the following measurements (in cm): [5.1 3.5 1.4 0.2]\n"
     ]
    }
   ],
   "source": [
    "from sklearn.datasets import load_iris\n",
    "flower_data = load_iris()\n",
    "flower_measurements = flower_data['data']\n",
    "num_flowers, num_measurements = flower_measurements.shape\n",
    "print(f\"{num_flowers} flowers have been measured.\")\n",
    "print(f\"{num_measurements} measurements were recorded for every flower.\")\n",
    "print(\"The first flower has the following measurements (in cm): \" \n",
    "      f\"{flower_measurements[0]}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Our data is 4-dimensional, but we want to plot it in 2D. Reducing the flower data to two dimensions requires that we project the dataset onto its first and second principal directions.\n",
    "\n",
    "**Listing 14. 29. Reducing flower measurements to two dimensions**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [],
   "source": [
    "pca_object_2D = PCA(n_components=2)\n",
    "transformed_data_2D = pca_object_2D.fit_transform(flower_measurements)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The computed `transformed_data_2D` matrix should be 2-dimensional. Therefore, it should contain just two columns.\n",
    "\n",
    "**Listing 14. 30. Checking the shape of a dimensionally reduced matrix**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The matrix contains 150 rows, corresponding to 150 recorded flowers.\n",
      "It also contains 2 columns, corresponding to 2 dimensions.\n"
     ]
    }
   ],
   "source": [
    "row_count, column_count = transformed_data_2D.shape\n",
    "print(f\"The matrix contains {row_count} rows, corresponding to \"\n",
    "      f\"{row_count} recorded flowers.\")\n",
    "print(f\"It also contains {column_count} columns, corresponding to \"\n",
    "      f\"{column_count} dimensions.\") "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "How much of the total data-variance is covered by our outputted data matrix? We can find out, using the `explained_variance_ratio_` attribute of `pca_object_2D`.\n",
    "\n",
    "**Listing 14. 31. Measuring the variance-coverage of a dimensionally reduced matrix**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The x-axis covers 92.46% of the total variance\n",
      "The y-axis covers 5.31% of the total variance\n",
      "Together, the 2 axes cover 97.77% of the total variance\n"
     ]
    }
   ],
   "source": [
    "def print_2D_variance_coverage(pca_object): \n",
    "    percent_var_coverages = 100 * pca_object.explained_variance_ratio_\n",
    "    x_axis_coverage, y_axis_coverage = percent_var_coverages\n",
    "    total_coverage = x_axis_coverage + y_axis_coverage\n",
    "    print(f\"The x-axis covers {x_axis_coverage:.2f}% \"\n",
    "    \t    \"of the total variance\")\n",
    "    print(f\"The y-axis covers {y_axis_coverage:.2f}% \"\n",
    "           \"of the total variance\")\n",
    "    print(f\"Together, the 2 axes cover {total_coverage:.2f}% \"\n",
    "           \"of the total variance\")\n",
    "    \n",
    "print_2D_variance_coverage(pca_object_2D)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Our dimensionally-reduced matrix covers more than 97% of the total data variance. Thus, a scatter plot of `transformed_data_2D` should display most of the clustering patterns present in the dataset.\n",
    "\n",
    "**Listing 14. 32. Plotting flower data in 2D**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(transformed_data_2D[:,0], transformed_data_2D[:,1])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Based on the plot clustering, we can assume that 2 or 3 flower-types are present. In fact, our measured data represents 3 unique species of flower. This species information is stored within the `flower_data` dictionary. Lets color each plotted flower by species\n",
    "\n",
    "**Listing 14. 33. Coloring plotted data by flower species**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def visualize_flower_data(dim_reduced_data):\n",
    "    species_names = flower_data['target_names']\n",
    "    for i, species in enumerate(species_names):\n",
    "        species_data = np.array([dim_reduced_data[j] \n",
    "                                 for j in range(dim_reduced_data.shape[0])\n",
    "                                 if flower_data['target'][j] == i]).T\n",
    "        plt.scatter(species_data[0], species_data[1], label=species.title(),\n",
    "                     color=['g', 'k', 'y'][i])\n",
    "    plt.legend()\n",
    "    plt.show()\n",
    "\n",
    "visualize_flower_data(transformed_data_2D)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "_Versicolor_ and _Virgincia_ share a bit of overlap, implying that they have similar petal properties. On the other hand, _Setosa_ forms an entirely separate cluster. A vertical x-value threshold of -2 is sufficient to isolate _Setosa_ from the other 2 species of flowers.\n",
    "\n",
    "**Listing 14. 34. Defining a Setosa detector based on dimensionally-reduced data**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The sample could be a Setosa\n"
     ]
    }
   ],
   "source": [
    "def detect_setosa(flower_sample):\n",
    "    centered_sample = flower_sample - pca_object_2D.mean_\n",
    "    projection = pca_object_2D.components_[0] @ centered_sample\n",
    "    if projection < -2:\n",
    "        print(\"The sample could be a Setosa\")\n",
    "    else:\n",
    "        print(\"The sample is not a Setosa\")\n",
    "\n",
    "new_flower_sample = np.array([4.8, 3.7, 1.2, 0.24])\n",
    "detect_setosa(new_flower_sample)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 14.3.1. Limitations of PCA\n",
    "\n",
    "PCA is overly sensitive to units of measurement. For example, our flower measurements are all in centimeters. However, one can imagine converting the first axis into millimeters. The information content of that axis should not change. However, its variance will shift. \n",
    "\n",
    "**Listing 14. 35. Measuring the effect of unit-change on axis variance**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The variance of the first axis is: 0.68\n",
      "We've converted the measurements from cm to mm.\n",
      "That variance now equals 68.11\n"
     ]
    }
   ],
   "source": [
    "first_axis_var = flower_measurements[:,0].var()\n",
    "print(f\"The variance of the first axis is: {first_axis_var:.2f}\")\n",
    "\n",
    "flower_measurements[:,0] *= 10\n",
    "first_axis_var = flower_measurements[:,0].var()\n",
    "print(\"We've converted the measurements from cm to mm.\\nThat variance \"\n",
    "      f\"now equals {first_axis_var:.2f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now, the first-axis variance dominates our dataset. Consider the consequences of running PCA on these modified flower measurements. Consequently, PCA will project all the data onto the first-axis. Our reduced data will collapse to 1-dimension.\n",
    "\n",
    "**Listing 14. 36. Measuring the effect of unit-change on PCA**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The x-axis covers 98.49% of the total variance\n",
      "The y-axis covers 1.32% of the total variance\n",
      "Together, the 2 axes cover 99.82% of the total variance\n"
     ]
    }
   ],
   "source": [
    "pca_object_2D.fit_transform(flower_measurements)\n",
    "print_2D_variance_coverage(pca_object_2D) "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If we normalize our axes, than all the axes-values will lie between 0 and 1. The dominance of the first-axes will thusly be eliminated. \n",
    "\n",
    "**Listing 14. 37. Normalizing data to eliminate measurement-unit differences**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The x-axis covers 94.00% of the total variance\n",
      "The y-axis covers 3.67% of the total variance\n",
      "Together, the 2 axes cover 97.67% of the total variance\n"
     ]
    }
   ],
   "source": [
    "for i in range(flower_measurements.shape[1]):\n",
    "    flower_measurements[:,i] /= norm(flower_measurements[:,i])\n",
    "    \n",
    "transformed_data_2D = pca_object_2D.fit_transform(flower_measurements)\n",
    "print_2D_variance_coverage(pca_object_2D)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Normalization has slightly modified our data. Despite these changes, the total 2D variance coverage still sums to approximately 97%. We'll replot the PCA output in order to confirm that the 2D clustering patterns remain unchanged,\n",
    "\n",
    "**Listing 14. 38. Plotting 2D PCA output after normalization**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "visualize_flower_data(transformed_data_2D)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Unfortunately, normalization does carry certain unintended consequences. All values now lie less than 1-unit from their mean. This is a problem. PCA requires us to subtract the mean from each axis-value, in order to centralize our data. However, it's computationally difficult to subtract the mean from a value that is very close to that mean. This substraction could cause errors.\n",
    "\n",
    "**Listing 14. 39. Illustrating errors caused by values proximate to their mean**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Actual mean is equal to -5.551115123125783e-17\n"
     ]
    }
   ],
   "source": [
    "data = np.array([1 + 1e-3, 1 - 1e-3])\n",
    "mean = data.mean()\n",
    "assert mean == 1\n",
    "centralized_data = data - 2 * [mean]\n",
    "assert centralized_data.mean() != 0\n",
    "print(f\"Actual mean is equal to {centralized_data.mean()}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We cannot reliably centralize data that lies close to the mean. Hence, we can't reliably execute PCA on normalized data. What should we do?\n",
    "\n",
    "A solution to our problem does exist. However, to derive it, we must dive deep into the guts of the PCA algorithm. We must learn how to compute the principal components from scratch, without rotation.\n",
    "\n",
    "## 14.4. Computing Principal Components Without Rotation\n",
    "\n",
    "By storing all our variances in a matrix, we can extract our components without rotation. This matrix can be computed in a single line of code. We just need to multiply our matrix with its transpose, while also dividing by data-size. The result will be a matrix, which is called the **covariance matrix**. The diagonal of a covariance matrix stores the variance along each axis.\n",
    "\n",
    "**Listing 14. 40. Computing a covariance matrix**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Covariance matrix:\n",
      " [[ 26.99916667 106.30456732]\n",
      " [106.30456732 519.8206294 ]]\n"
     ]
    }
   ],
   "source": [
    "cov_matrix = centered_data @ centered_data.T / centered_data.shape[1]\n",
    "print(f\"Covariance matrix:\\n {cov_matrix}\")\n",
    "for i in range(centered_data.shape[0]):\n",
    "    variance = cov_matrix[i][i]\n",
    "    assert round(variance, 10) == round(centered_data[i].var(), 10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The covariance matrix and the principal components share very special (and useful) relationship. The normalized product of a covariance matrix and a principal component will equal that principal component!\n",
    "\n",
    "**Listing 14. 41. Exposing the relationship between `cov_matrix` and `first_pc`**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAD4CAYAAADvsV2wAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAApXElEQVR4nO3de3xU5b3v8c8vhPtVERHFElAUyD0EBBKEiFAUFayAxUvBbku1trWtekS7vfSyT3uqx6rVU19sraJYi1JFdGOVoigICAHCHUFE5LYxYLlHIOR3/pgxO8TcZzIrMN/36zWvzKz1ZD3fWRl+rHlmzbPM3RERkVNfQtABREQkNlTwRUTihAq+iEicUMEXEYkTKvgiInEiMegAVTnjjDM8KSkp6BgiIieNpUuX7nb3DhWta9AFPykpifz8/KBjiIicNMxsS2XrNKQjIhInVPBFROKECr6ISJxo0GP4FTl27Bjbtm3jq6++CjqKyAmaNWtG586dady4cdBRRCp00hX8bdu20bp1a5KSkjCzoOOIAODu7Nmzh23bttG1a9eg44hUKCpDOmY23Mw+NrNPzGxSBevNzB4Pr19pZll17eurr76iffv2KvbSoJgZ7du31ztPadAiLvhm1gh4ErgM6AWMM7Ne5ZpdBnQP3yYCf46wz0h+XaRe6HUpDV00jvD7Ap+4+6fufhT4GzCyXJuRwPMesghoZ2adotC3yEnv0KE1bN78IEeP7go6ipziolHwzwG2lnm8Lbystm0AMLOJZpZvZvmFhYVRiBd9jRo1IiMjo/T22WefMWDAgFpt49FHH+Xw4cMVrhs8eDAXXngh6enp5OTk8PHHH1fY7uabb2bt2rW1zg/UOm/5fBV9Ie7YsWNMmjSJ7t27k5KSQt++fXnrrbfq3E9D8Nlnn/HXv/61Xvt48snfMHr0rzh06GC99iMSjYJf0fvY8ldVqUmb0EL3ye6e7e7ZHTpU+O3gwDVv3pyCgoLSW1JSEgsWLPhGu+PHj1e6jaoKPsCLL77IihUrGD9+PHfddVeF23766afp1av86FnNVJQ3Uvfddx87d+5k9erVrF69mjfeeIMDBw5EvZ9YikXB/+CDRWzdmsBpp51Xr/2IRKPgbwPOLfO4M7CjDm1Oaq1atQJg7ty55OXlcd1115GamsqhQ4cYMWIE6enppKSkMG3aNB5//HF27NhBXl4eeXl5VW734osv5pNPPint4/777+eiiy5i4cKFJxxpt2rVil/+8pekp6fTr18/du0KDQ/s2rWLq6++mvT0dNLT00sLfdm8F198MVdffTW9evXilltuoaSkBIBbb72V7OxskpOTeeCBB6rMefjwYf7zP/+TP/3pTzRt2hSAjh07MnbsWABeeuklUlNTSUlJ4e677z5hv91999307t2bSy+9lMWLFzN48GC6devGzJkzAXjuuecYOXIkw4cP58ILL+RXv/pV6e8/8sgjpKSkkJKSwqOPPgqEinTPnj35wQ9+QHJyMsOGDaOoqAiATZs2MXz4cHr37s3AgQNZv349ABMmTOCnP/0pAwYMoFu3bkyfPh2ASZMmMW/ePDIyMvjjH/9Y5T6oq5Urd5Caema9bFvkBO4e0Y3QqZ2fAl2BJsAKILlcmxHAW4SO9PsBi2uy7d69e3t5a9euLb2/YcPtvmzZoKjeNmy4/Rt9lpeQkODp6emenp7uo0aNcnf3li1burv7e++95y1atPBPP/3U3d2nT5/uN998c+nv7t27193du3Tp4oWFhRVuf9CgQb5kyRJ3d//DH/7gY8eOdQ/tSJ82bVqF7QCfOXOmu7vfdddd/pvf/Mbd3ceOHet//OMf3d29uLi4tP+yeZs2beqbNm3y4uJiv/TSS/2VV15xd/c9e/aU/t6gQYN8xYoV3+j3aytWrPCMjIwKn8/27dv93HPP9S+++MKPHTvmeXl5/tprr5XmnjVrlru7jxo1yocOHepHjx71goICT09Pd3f3Z5991s866yzfvXu3Hz582JOTk33JkiWen5/vKSkpfvDgQT9w4ID36tXLly1b5ps3b/ZGjRr58uXL3d19zJgx/sILL7i7+yWXXOIbNmxwd/dFixZ5Xl6eu7uPHz/eR48e7cePH/c1a9b4eeedV7p/RowYUeHzqkjZ12dNfPHFZw74nXdeWqvfE6kMkO+V1NSIz8N392Iz+zHwNtAI+Iu7rzGzW8LrnwJmAZcDnwCHgZsi7TdIXw/pVKZv376l52KnpqZy5513cvfdd3PFFVcwcODAGvVx/fXX07x5c5KSkvjTn/4EhD47uOaaayps36RJE6644goAevfuzezZswF49913ef7550t/v23bthXm7datGwDjxo1j/vz5jB49mpdffpnJkydTXFzMzp07Wbt2LWlpaTXK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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_vector(vector, **kwargs):\n",
    "    plt.plot([0, vector[0]], [0, vector[1]], **kwargs)\n",
    "\n",
    "plot_vector(first_pc, c='y', label='First Principal Component')\n",
    "product_vector = cov_matrix @ first_pc\n",
    "product_vector /= norm(product_vector)\n",
    "plot_vector(product_vector, c='k', linestyle='--',\n",
    "            label='Normalized Product Vector')\n",
    "\n",
    "plt.legend()\n",
    "plt.axis('equal')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The maxtrix-vector product of `cov_matrix` and `first_pc` points in the same direction as `first_pc`. Thus, by definition, `first_pc` is an **eigenvector** of `cov_matrix`. An eigenvector of a matrix satisfies the following special property; the product of the matrix and the eigenvector points in the same direction as the eigenvector. The direction will not shift, no matter how many times we take the product.\n",
    "\n",
    "**Listing 14. 42. Computing the angle between eigenvector products**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The angle between vectors equals 0.00 degrees\n"
     ]
    }
   ],
   "source": [
    "product_vector2 = cov_matrix @ product_vector\n",
    "product_vector2 /= norm(product_vector2)\n",
    "cosine_similarity = product_vector @ product_vector2\n",
    "angle = np.degrees(np.arccos(cosine_similarity))\n",
    "print(f\"The angle between vectors equals {angle:.2f} degrees\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The product of a matrix and its eigenvector maintains the eigenvector's direction. However, in most cases, it will alter the eigenvector's magnitude.\n",
    "\n",
    "**Listing 14. 43. Measuring the shift in magnitude**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Multiplication has stretched the first principal component by approximately 541.8 units.\n"
     ]
    }
   ],
   "source": [
    "new_magnitude = norm(cov_matrix @ first_pc)\n",
    "print(\"Multiplication has stretched the first principal component by \"\n",
    "      f\"approximately {new_magnitude:.1f} units.\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Multiplication has stretched-out `first_pc` by 541.8 units. That numeric value is formally called the **eigenvalue**. \n",
    "Our eigenvalue of 541.8 may seem familiar. This is because it equals the variance along the first principal direction.\n",
    "\n",
    "**Listing 14. 44. Comparing an eigenvalue to the variance**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The variance along the first principal direction is approximately 541.8\n"
     ]
    }
   ],
   "source": [
    "variance = (centered_data.T @ first_pc).var()\n",
    "direction1_var = projections[0].var()\n",
    "print(\"The variance along the first principal direction is approximately\" \n",
    "       f\" {variance:.1f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Mathematicians have proven the following:\n",
    "\n",
    "* The principal components of a dataset are equal to the normalized eigenvectors of the dataset's covariance matrix.\n",
    "* The variance along a principal direction is equal to the eigenvalue of the associated principal component.\n",
    "\n",
    "Consequently, to uncover the first principal component, we need to:\n",
    "1. Compute the covariance matrix.\n",
    "2. Find the eigenvector of the matrix with the largest eigenvalue. \n",
    "\n",
    "We can extract the eigenvector with the largest eigenvalue using an algorithm called **power iteration**.\n",
    "\n",
    "### 14.4.1. Extracting Eigenvectors Using Power Iteration\n",
    "\n",
    "Our goal is to obtain the eigenvectors of `cov_matrix` . We'll start by generating a random unit-vector, `random_vector`.\n",
    "\n",
    "**Listing 14. 45. Generating a random unit-vector**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(0)\n",
    "random_vector = np.random.random(size=2)\n",
    "random_vector /= norm(random_vector)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next, we'll compute `cov_matrix @ random_vector`. This matrix-vector product will both rotate and stretch our random vector. We'll normalize the new vector so that its magnitude is comparable to `random_vector`.\n",
    "\n",
    "**Listing 14. 46. Taking the product of `cov_matrix` and `random_vector`**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "product_vector = cov_matrix @ random_vector\n",
    "product_vector /= norm(product_vector) \n",
    "\n",
    "plt.plot([0, random_vector[0]], [0, random_vector[1]], \n",
    "          label='Random Vector')\n",
    "plt.plot([0, product_vector[0]], [0, product_vector[1]], linestyle='--',\n",
    "         c='k', label='Normalized Product Vector')\n",
    "\n",
    "plt.legend()\n",
    "plt.axis('equal')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Our 2 vectors have nothing in common. Lets see what happens when we repeat the procedure by running `cov_matrix @ product_vector`.\n",
    "\n",
    "**Listing 14. 47. Taking the product of cov_matrix and product_vector**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD4CAYAAAD8Zh1EAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nO3de3RU5b3/8feXEG4iIJeKclcBgRASCEHAFAWpoK2KiorHa4scj9ijPfpTu2wV8fQclV6slVq1FpS2gohSbGFVqaCiYggaUYJgwFvwFoJBEq6B7++PDDkhJGSSTGZPZj6vtbKcvfeTPZ8ZJl/3PPvZzzZ3R0REmr5mQQcQEZHIUEEXEYkTKugiInFCBV1EJE6ooIuIxInmQT1x586dvXfv3kE9vYhIk7R27dpt7t6lum2BFfTevXuTk5MT1NOLiDRJZvZJTdvU5SIiEidqLehm9icz+9rM3q9hu5nZQ2aWb2brzGxo5GOKiEhtwjlCnwtMOMr2iUDf0M804JGGxxIRkbqqtQ/d3V81s95HaXI+8JSXzyGw2sw6mNkJ7v5FXcPs37+fgoIC9uzZU9dfFQlUq1at6N69O8nJyUFHkQQWiZOi3YDPKi0XhNYdUdDNbBrlR/H07NnziB0VFBRw7LHH0rt3b8wsAtFEGp+7U1RUREFBAX369Ak6jiSwqJ4UdffH3D3D3TO6dDly1M2ePXvo1KmTirk0KWZGp06d9M1SAheJgr4V6FFpuXtoXb2omEtTpM+txIJIFPQlwFWh0S6nATvq038uIiINE86wxaeBN4H+ZlZgZj8ys+vN7PpQk6XAFiAfeBy4odHSRoGZccstt1Qs//KXv2TGjBlRzXDNNdfw7LPPAjB16lTy8vIatL+PP/6YlJSUate3bt2atLQ0Bg4cyPXXX8/Bgwfr/TwzZszgl7/8Zb1+98EHH2TXrl1HrL/nnnv46U9/eti63NxcBgwYUOfnyM3NZenSpfXK1xDPPPMMt912GwcOHIj6c0tiqbWgu/sUdz/B3ZPdvbu7P+Huf3D3P4S2u7tPd/eT3X2wuzfpyz9btmzJc889x7Zt2+r1+2VlZRHN88c//pGBAwdGdJ+VnXzyyeTm5rJu3Try8vJYvHjxYdsj/XpqUlNBnzJlCgsWLDhs3fz585kyZUqdn6M+Bb3Brz83lxVPPcXChQtJSkpq2L5EaqErRato3rw506ZN4ze/+c0R2z7++GPGjh1Lamoq48aN49NPPwXKj6ivv/56RowYwW233caMGTO4+uqrycrKolevXjz33HPcdtttDB48mAkTJrB//34AZs6cyfDhw0lJSWHatGlUd/eoM844g5ycHJYsWUJaWhppaWn079+/YjTF2rVrGTNmDMOGDePss8/miy++qFg/ZMgQhgwZwuzZs8N63aNGjSI/P5+VK1eSlZXFeeedV/E/k1//+tekpKSQkpLCgw8+WPF7v/jFL+jXrx+nn346GzduPCI3wLZt2zg0b8+BAwe49dZbSUlJITU1ld/97nc89NBDfP7555x55pmceeaZh+Xq168fxx13HG+99VbFumeeeaaioL/44ouMHDmSoUOHMnnyZEpKSgBYs2YNo0aNYsiQIWRmZrJjxw7uuusuFixYQFpaGgsWLGD79u1ccMEFpKamctppp7Fu3Tqg/JvGlVdeyejRo7nyyitrfe+Oato0rlq+nMzMzIbtRyQc7h7Iz7Bhw7yqvLy8w5bHjBlzxM/s2bPd3b20tLTa7XPmzHF398LCwiO2heOYY47xHTt2eK9evby4uNhnzZrld999t7u7f//73/e5c+e6u/sTTzzh559/vru7X3311X7uued6WVmZu7vffffdPnr0aN+3b5/n5uZ669atfenSpe7ufsEFF/jzzz/v7u5FRUUVz3vFFVf4kiVLKva3cOHCivdgzZo1h2WcPHmyP/zww75v3z4fOXKkf/311+7uPn/+fL/22mvd3X3w4MH+yiuvuLv7rbfe6oMGDTritX700UcV60tLSz0jI8OXLl3qK1as8DZt2viWLVvc3T0nJ8dTUlK8pKTEd+7c6QMHDvS33367Yn1paanv2LHDTz75ZJ81a9YRuQsLC71Xr17u7v773//eL7roIt+/f/9h70GvXr28sLCw2n+TWbNm+c033+zu7m+++aYf+uwUFhZ6VlaWl5SUuLv7fffd5/fcc4/v3bvX+/Tp49nZ2e7uvmPHDt+/f7/PmTPHp0+fXrHfG2+80WfMmOHu7v/61798yJAhFf9+Q4cO9V27dlWbpyZVP7/u7geys33RLbf4smXL6rQvkZoAOV5DXQ1scq5Y1q5dO6666ioeeughWrduXbH+zTff5LnnngPgyiuv5LbbbqvYNnny5MO+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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "product_vector2 = cov_matrix @ product_vector\n",
    "product_vector2 /= norm(product_vector2) \n",
    "\n",
    "plt.plot([0, product_vector[0]], [0, product_vector[1]], linestyle='--',\n",
    "         c='k', label='Normalized Product Vector')\n",
    "plt.plot([0, product_vector2[0]], [0, product_vector2[1]], linestyle=':',\n",
    "         c='r', label='Normalized Product Vector2')\n",
    "plt.legend()\n",
    "plt.axis('equal')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Our product vectors point in an identical direction! Therefore, `product_vector` is an eigenvector of `cov_matrix`. Basically, we’ve carried out a power iteration. Lets define a `power_iteration` function. \n",
    "\n",
    "**Listing 14. 48. Implementing the power iteration algorithm**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The extracted eigenvector is [0.20223994 0.979336  ]\n",
      "Its eigenvalue is approximately  541.8\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(0)\n",
    "def power_iteration(matrix):\n",
    "    random_vector = np.random.random(size=matrix.shape[0])\n",
    "    random_vector = random_vector / norm(random_vector)\n",
    "    old_rotated_vector = random_vector\n",
    "    for _ in range(10):\n",
    "        rotated_vector = matrix @ old_rotated_vector\n",
    "        rotated_vector = rotated_vector / norm(rotated_vector)\n",
    "        old_rotated_vector = rotated_vector\n",
    "    \n",
    "    eigenvector = rotated_vector\n",
    "    eigenvalue = norm(matrix @ eigenvector)\n",
    "    return eigenvector, eigenvalue\n",
    "\n",
    "eigenvector, eigenvalue = power_iteration(cov_matrix)\n",
    "print(f\"The extracted eigenvector is {eigenvector}\")\n",
    "print(f\"Its eigenvalue is approximately {eigenvalue: .1f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Our function returned the principal component with the largest variance coverage. The second principal component is also an eigenvector. How do we find it? \n",
    "\n",
    "In order to extract the second eigenvector, we must eliminate all traces of the first eigenvector from `cov_matrix`. This process is known as **matrix deflation**. Once a matrix is deflated, its second-largest eigenvalue will become its largest eigenvalue. In order to deflate `cov_matrix`, we must take the **outer product** of `eigenvector` with itself. That outer product is computed by taking the pairwise product of `eigenvector[i] * [j]` for every possible value of `i` and `j`.\n",
    "\n",
    "**Listing 14. 49. Computing the outer product of an eigenvector with itself**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {},
   "outputs": [],
   "source": [
    "outer_product = np.outer(eigenvector, eigenvector)\n",
    "for i in range(eigenvector.size):\n",
    "    for j in range(eigenvector.size):\n",
    "        assert outer_product[i][j] == eigenvector[i] * eigenvector[j]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Given the outer product, we can deflate `cov_matrix` by running `cov_matrix - eigenvalue * outer_product`. That basic operation will produce a matrix whose primary eigenvector is equal to the second principal component.\n",
    "\n",
    "**Listing 14. 50. Deflating the covariance matrix**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [],
   "source": [
    "deflated_matrix = cov_matrix - eigenvalue * outer_product"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Running `product_iteration(deflated_matrix)` will return an eigenvector, That eigenvector will equal the second principal component. Projecting on both principal components will recreate our cigar-shaped plot.\n",
    "\n",
    "**Listing 14. 51. Extracting the second principal component from the deflated matrix**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "np.random.seed(0)\n",
    "next_eigenvector, _ = power_iteration(deflated_matrix)\n",
    "components = np.array([eigenvector, next_eigenvector])\n",
    "projections = components @ centered_data\n",
    "plt.scatter(projections[0], projections[1])\n",
    "plt.axhline(0, c='black')\n",
    "plt.axvline(0, c='black')\n",
    "plt.axis('equal')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We've basically developed an algorithm for extracting the top K principal components of a matrix whose axis-means are zero. Lets implement the algorithm, by defining `find_top_principal_components`.\n",
    "\n",
    "**Listing 14. 52. Extracting the top K principal components**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {},
   "outputs": [],
   "source": [
    "def find_top_principal_components(centered_matrix, k=2):\n",
    "    cov_matrix = centered_matrix @ centered_matrix.T\n",
    "    cov_matrix /= centered_matrix[1].size\n",
    "    return find_top_eigenvectors(cov_matrix, k=k)\n",
    " \n",
    "def find_top_eigenvectors(matrix, k=2):\n",
    "    matrix = matrix.copy()\n",
    "    eigenvectors = []\n",
    "    for _ in range(k):\n",
    "        eigenvector, eigenvalue = power_iteration(matrix)\n",
    "        eigenvectors.append(eigenvector)\n",
    "        matrix -= eigenvalue * np.outer(eigenvector, eigenvector)\n",
    "    \n",
    "    return np.array(eigenvectors)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We’re now able to run PCA from scratch, without relying on Scikit-Learn. Lets execute this implementation by defining a `reduce_dimensions` function. Why not name the function `pca`? Well, the first 2 steps of the PCA require us to centralize our data. However, we'll soon learn that dimension reduction can be achieved without centralization. Thus, we'll pass an optional `centralize_data` parameter into our function. We'll preset the parameter to `True`, guaranteeing that the function executes PCA under default conditions.\n",
    "\n",
    "**Listing 14. 53. Defining a `reduce_dimensions` function**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {},
   "outputs": [],
   "source": [
    "def reduce_dimensions(data, k=2, centralize_data=True):\n",
    "    data = data.T.copy()\n",
    "    if centralize_data:\n",
    "        for i in range(data.shape[0]):\n",
    "            data[i] -= data[i].mean() \n",
    "            \n",
    "    principal_components = find_top_principal_components(data)\n",
    "    return (principal_components @ data).T"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Lets test `reduce_dimensions` by applying to our previously analyzed `flower_measurements` data.\n",
    "\n",
    "**Listing 14. 54. Reducing flower data to 2D using a custom PCA implementation**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "np.random.seed(0)\n",
    "dim_reduced_data = reduce_dimensions(flower_measurements)\n",
    "visualize_flower_data(dim_reduced_data)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We have re-engineered Sckit-Learn’s implementation, but with one big difference. In our function, centralization is optional. As we’ve discussed, we can’t reliably perform centralization on normalized data. One alternative is to bypass centralization, by passing `centralize_data=False` into our `reduce_dimensions` function.\n",
    "\n",
    "**Listing 14. 55. Running `reduce_dimensions` without centralization**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "np.random.seed(3)\n",
    "dim_reduced_data = reduce_dimensions(flower_measurements, \n",
    "                                     centralize_data=False)\n",
    "visualize_flower_data(dim_reduced_data)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Within the output, the 3 species of flowers continue to separate into 3 clusters. Does this output continue to represent 97% of the total data variance? We can check by measuring the variance of `dim_reduced_data` and dividing it by the total variance of `flower_measurements`.\n",
    "\n",
    "**Listing 14. 56. Checking the variance of data reduced without centralization**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Our plot covers 97.29% of the total variance\n"
     ]
    }
   ],
   "source": [
    "variances = [sum(data[:,i].var() for i in range(data.shape[1]))\n",
    "             for data in [dim_reduced_data, flower_measurements]]\n",
    "dim_reduced_var, total_var = variances\n",
    "percent_coverege = 100 * dim_reduced_var / total_var\n",
    "print(f\"Our plot covers {percent_coverege:.2f}% of the total variance\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The variance coverage remains at approximately 97%. We thusly can reduce dimensionality without relying on centralization. Our modefied technique is called **Singular Value Decomposition**, or **SVD** for short. An efficient SVD implementation is available in Scikit-Learn.\n",
    "\n",
    "## 14.5. Efficient Dimension Reduction Using SVD and Scikit-Learn\n",
    "\n",
    "Scikit-Learn contains a dimension reduction class called `TruncatedSVD`.  Lets import `TruncatedSVD` from `sklearn.decomposition`.\n",
    "\n",
    "**Listing 14. 57. Importing `TruncatedSVD` from Scikit-Learn**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.decomposition import TruncatedSVD"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Lets apply `TrucatedSVD` to `flower_measurements`.\n",
    "\n",
    "**Listing 14. 58. Running SVD using Scikit-Learn**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "svd_object = TruncatedSVD(n_components=2)\n",
    "svd_object = TruncatedSVD(n_components=2)\n",
    "svd_transformed_data = svd_object.fit_transform(flower_measurements)\n",
    "visualize_flower_data(svd_transformed_data)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Not surprisingly, Scikit-Learn's results are identical to our custom SVD implementation. We can further verify the overlap between our output and Scikit-Learn's by comparing variance coverage results.\n",
    "\n",
    "**Listing 14. 59. Extracting variance from Scikit-Learn’s SVD output**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Our Scikit-Learn SVD output covers 97.29% of the total variance\n"
     ]
    }
   ],
   "source": [
    "percent_variance_coverages = 100 * svd_object.explained_variance_ratio_\n",
    "x_axis_coverage, y_axis_coverage = percent_variance_coverages\n",
    "total_2d_coverage = x_axis_coverage + y_axis_coverage\n",
    "print(f\"Our Scikit-Learn SVD output covers {total_2d_coverage:.2f}% of \"\n",
    "       \"the total variance\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
